首页 > 解决方案 > 在熊猫系列中保留带有图案的元素而不将它们转换为列表

问题描述

我有以下数据框:

df = pd.DataFrame(["Air type:1, Space kind:2, water", "something, Space blu:3, somethingelse"], columns = ['A'])

我想创建一个新列,其中包含每一行所有具有“:”的元素。例如,在第一行我想返回“type:1, kind:2”,第二行我想返回“blu:3”。我通过以下方式使用列表理解进行管理:

df['new'] = [[y for y in x  if ":" in y] for x in df['A'].str.split(",")]

但我的问题是新列包含列表元素。

    A                                                       new
0   Air type:1, Space kind:2, water                         [Air type:1, Space kind:2]
1   something at the start:4, Space blu:3, somethingelse    [something at the start:4, Space blu:3]

我没有经常使用 Python,所以我不是 100% 是否缺少更具体的 Pandas 方法来做到这一点。如果有的话,很高兴了解并使用它。如果这是一种正确的方法,我如何将元素转换回字符串以便对它们执行正则表达式?我试过如何将列表中的项目连接到单个字符串?但这并没有像我希望的那样工作。

标签: pythonregexpandaslistseries

解决方案


你可以pd.Series.str.findall在这里使用。

df['new'] = df['A'].str.findall('\w+:\w+')

                                 A               new
0            type:1, kind:2, water  [type:1, kind:2]
1  something, blu:3, somethingelse           [blu:3]

编辑

当有多个单词时,请尝试

df['new'] = df['A'].str.findall('[^\s,][^:,]+:[^:,]+').str.join(', ')

                                      A                       new
0        Air type:1, Space kind:2, water  Air type:1, Space kind:2
1  something, Space blu:3, somethingelse               Space blu:3

推荐阅读