如何分割在大熊猫列获得第一列,如果空

问题描述 投票:3回答:5

我想我的输入数据列与分裂的帮助,大熊猫通过使用“”作为分隔符分割成2列。当我使用它,我得到的所有之前“”在列1项等人在列2。

输入数据:-

Site ID

AIR5   
3_CCN1_3_6   
3_CCN1,2,3   
12_SDP5,6,7,8,9,10  
3_CCN2a_CCN2b_CCN3  
EMM

代码我用我的 -

df['Node Touch'] = df['Site ID'].str.split('_').str.get(0).fillna(0)   
df['Site ID'] = df['Site ID'].str.split('_').str.get(1).fillna(0)

输出我得到: -

CR ID         
2969721            AIR5          0  
2969165               3         CCN1_3_6   
2968440               3         CCN1,2,3   
2968199              12         SDP5,6,7,8,9,10    
2967663               3         CCN2a_CCN2b_CCN3   
2965269             EMM          0

但是,我想,如果“_”是不存在的输入数据,那么第一栏应该得到0和第二的列值

预期输出: -

 CR ID         
2969721            0       AIR5    
2969165            3       CCN1_3_6    
2968440            3       CCN1,2,3    
2968199           12       SDP5,6,7,8,9,10    
2967663            3       CCN2a_CCN2b_CCN3    
2965269            0       EMM  
python pandas split
5个回答
3
投票

修改不包含下划线,然后分割字符串

df.loc[~df['Site ID'].str.contains('_'), 'Site ID'] = '0_' + df['Site ID']
df[['Node Touch', 'Site ID']] = df['Site ID'].str.split('_', 1, expand = True)

    Site ID             Node Touch
0   AIR5                0
1   CCN1_3_6            3
2   CCN1,2,3            3
3   SDP5,6,7,8,9,10     12
4   CCN2a_CCN2b_CCN3    3
5   EMM                 0

选项2:如果您的节点列总是会是数字,你可以试试这个。虽然我认为第一个方案更简单

df[['Node Touch', 'Site ID']] = df['Site ID'].str.split('_', 1, expand = True)
df['Site ID'] = df['Site ID'].combine_first(df['Node Touch'])
df['Node Touch'] = pd.to_numeric(df['Node Touch'], errors = 'coerce').fillna(0).astype(int)

3
投票

您可以使用extract用正则表达式可选捕获组:

df[['Node Touch', 'Site ID']] = df['Site ID'].str.extract('(\d+)?_?(\w+)_?').fillna(0)

输出:

            Site ID Node Touch
0              AIR5          0
1          CCN1_3_6          3
2              CCN1          3
3              SDP5         12
4  CCN2a_CCN2b_CCN3          3
5               EMM          0

1
投票

您的问题,解决的办法是检查是否“_”是存在的字符串,并相应地改变你的输出。您可以通过使用np.where实现这一目标。

Node_touch = df['Site ID'].str.split('_').str.get(0)  
Site_ID = df['Site ID'].str.split('_').str.get(1)
check_underscore = df['Site ID'].str.contains('_')
df['Node Touch'] = np.where(check_underscore, Node_touch, 0)   
df['Site ID'] = np.where(check_underscore, Site_ID, df['Site ID'])

1
投票

使用df.shift()分裂后的另一种方法。

df[['Node Touch', 'Site ID']]=df['Site ID'].str.split("_",n=1,expand=True)
df.loc[df['Site ID'].isna(),['Node Touch', 'Site ID']] = df[['Node Touch', 'Site ID']].shift(axis=1).fillna(0)
print(df)

            Site ID Node Touch
0              AIR5          0
1          CCN1_3_6          3
2          CCN1,2,3          3
3   SDP5,6,7,8,9,10         12
4  CCN2a_CCN2b_CCN3          3
5               EMM          0

0
投票

谢谢大家...我用非下划线项的前缀附加1_的逻辑和它的工作。

在:-

df.loc[~df['Site ID'].str.contains('_'), 'Site ID'] = '1_' + df['Site ID']
df[['Node Touch', 'Site ID']] = df['Site ID'].str.split('_', 1, expand = True) print(df[['Node Touch','Site ID']])

OUT: -

        Node Touch                                           Site ID   
CR ID                                                               
2969721          1                                              AIR5   
2969165          3                                          CCN1_3_6    
2968440          3                                          CCN1,2,3   
2968199         12                                   SDP5,6,7,8,9,10    
2967663          3                                  CCN2a_CCN2b_CCN3    
2965269          1                                               EMM    
© www.soinside.com 2019 - 2024. All rights reserved.