Python 如何拆分pandas中的列以在

Python 如何拆分pandas中的列以在,python,pandas,split,Python,Pandas,Split,我正试图在pandas中使用“”作为分隔符的拆分帮助下,将输入数据列拆分为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 代码i我的使用:- df['Node Touch'] = df['Site ID'].str.split('_').str.get(0).fillna

我正试图在pandas中使用“”作为分隔符的拆分帮助下,将输入数据列拆分为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
代码i我的使用:-

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
但是,我希望,如果输入数据中没有“u”,那么第一列应该得到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  

您的问题的解决方案是检查字符串中是否存在“\”,并相应地更改输出。您可以使用
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'])

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

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)

您可以将
extract
与regex可选捕获组一起使用:

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
拆分后使用的另一种方法

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

谢谢大家…我使用了在非下划线条目的前缀中添加1的逻辑,它起了作用

在:-

df.loc[~df['Site ID'].str.contains('uu'),'Site ID']='1'+df['Site ID']
df[['Node Touch','Site ID']]=df['Site ID'].str.split('''u',1,expand=True) 打印(df[['Node Touch','Site ID']])

输出:-


真不敢相信我没有想到摘录:)如果你接受对你有效的解决方案,而不是将其作为答案发布,那就太好了
        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