Python 如何拆分pandas中的列以在
我正试图在pandas中使用“”作为分隔符的拆分帮助下,将输入数据列拆分为2列。当我使用它时,我会得到第1列中“”之前的所有条目,以及第2列中其他条目 输入数据:-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
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