我有一个数据帧,如下所示
df = pd.DataFrame({'person_id': [101,102,103,201,202],
'test_id':['A1:123,A25668','B1:TEST,B2456,B3#123','B3:456','B3:678,C1:345','C2:367,C3']})
我想将:
字符之前的部分提取到一个新列中。
我试过下面的,但效果不好
df['new_test'] = df['test_id'].str.split(",")
df= df.explode('new_test')
df['new_test_id'] = df['new_test'].str.split(":")[:0] #what index should I give here?
无论我在开始和切片运算符中给出什么,都无法将列表中的第一个项目获取到new_test_id
我希望我的输出如下所示
df['new_test_id']
A1
NaN
B1
NaN
B3
B3
B3
C3
NaN
如果需要第一个:
之前的值,则使用Series.str.extract
,^
用于字符串的匹配开始,.*
用于:
:之前的任何值
df['new_test_id'] = df['new_test'].str.extract("^(.*):")
print (df)
person_id test_id new_test new_test_id
0 101 A1:123,A25668 A1:123 A1
0 101 A1:123,A25668 A25668 NaN
1 102 B1:TEST,B2456,B3#123 B1:TEST B1
1 102 B1:TEST,B2456,B3#123 B2456 NaN
1 102 B1:TEST,B2456,B3#123 B3#123 NaN
2 103 B3:456 B3:456 B3
3 201 B3:678,C1:345 B3:678 B3
3 201 B3:678,C1:345 C1:345 C1
4 202 C2:367,C3 C2:367 C2
4 202 C2:367,C3 C3 NaN
您的解决方案是通过str[0]
进行选择,但如果不匹配:
:,则还需要设置NaN
df['new_test_id'] = df['new_test'].str.split(":").str[0].where(df['new_test'].str.contains(":"))