数据帧中的Pandas访问列表元素



我有一个数据帧,如下所示

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(":"))

最新更新