【问题标题】:Pandas access list element within a dataframe?Pandas 访问数据框中的列表元素?
【发布时间】:2021-09-14 10:25:16
【问题描述】:

我有一个如下所示的数据框

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?

无论我在 start 和 slice 运算符中给出什么,我都无法将列表中的第一项获取到 new_test_id

我希望我的输出如下所示

df['new_test_id']
A1
NaN
B1
NaN
B3
B3
B3
C3
NaN

【问题讨论】:

    标签: python pandas dataframe numpy pandas-groupby


    【解决方案1】:

    如果需要第一个 : 之前的值,请使用 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] 选择,但如果不匹配:,还需要设置NaNs:

    df['new_test_id'] = df['new_test'].str.split(":").str[0].where(df['new_test'].str.contains(":"))
    

    【讨论】:

    • 谢谢,点赞。是否可以通过列表中元素的索引位置来做?我们基本上想要每行列表中的第一项。我们不能使用索引吗?
    • @TheGreat - 添加到答案中。
    • 抱歉,第一个解决方案将所有内容都带到第 2 个 : 而不是第 1 个 : 的所有内容
    • 我把模式改成这样^[\d]*:
    猜你喜欢
    • 2023-02-24
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2020-09-30
    • 2021-11-10
    • 2021-11-30
    • 2018-02-05
    相关资源
    最近更新 更多