在熊猫系列中保留带有图案的元素而不将它们转换为列表
Posted
技术标签:
【中文标题】在熊猫系列中保留带有图案的元素而不将它们转换为列表【英文标题】:Keep elements with pattern in pandas series without converting them to list 【发布时间】:2021-03-05 13:44:46 【问题描述】:我有以下数据框:
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 方法来做到这一点。如果有的话,很高兴了解并使用它。 如果这是一种正确的方法,我如何将元素转换回字符串以便对它们进行正则表达式?我试过How to concatenate items in a list to a single string?,但这并没有像我希望的那样工作。
【问题讨论】:
【参考方案1】:您可以在此处使用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
【讨论】:
@User2321 更新了答案。修改了正则表达式模式以避免额外的空间,但可能有比这更好的正则表达式模式。 谢谢。好吧,根据问题和解决方案的规范,正则表达式优化对我来说不是首要任务:)【参考方案2】:您可以将findall
与join
一起使用:
import pandas as pd
df = pd.DataFrame(["type:1, kind:2, water", "something, blu:3, somethingelse"], columns = ['A'])
df['new'] = df['A'].str.findall(r'[^\s:,]+:[^\s,]+').str.join(', ')
df['new']
# => 0 type:1, kind:2
# => 1 blu:3
正则表达式匹配
[^\s:,]+
- 除了空格之外的一个或多个字符,:
和 ,
:
- 冒号
[^\s,]+
- 除空格和,
之外的一个或多个字符。
请参阅regex demo。
.str.join(', ')
将所有找到的匹配项与,
+空格连接起来。
【讨论】:
谢谢!您将如何处理 : 之前有多个单词的情况。我已经更新了我的代码示例(对于我只是忘记在其中放置一个双字示例造成的混乱表示歉意) @User2321 Ch3steR 建立在我的模式之上。r'[^\s:,][^:,]*:[^:,]+'
暂时可以。
新的一天,新的问题:***.com/questions/64981401/…以上是关于在熊猫系列中保留带有图案的元素而不将它们转换为列表的主要内容,如果未能解决你的问题,请参考以下文章