我想我的输入数据列与分裂的帮助,大熊猫通过使用“”作为分隔符分割成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
修改不包含下划线,然后分割字符串
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
用正则表达式可选捕获组:
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
您的问题,解决的办法是检查是否“_”是存在的字符串,并相应地改变你的输出。您可以通过使用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.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
谢谢大家...我用非下划线项的前缀附加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