从 Pandas Dataframe Column 中删除重复的逗号,换句话说,我只需要列中的文本,用逗号分隔它们
Posted
技术标签:
【中文标题】从 Pandas Dataframe Column 中删除重复的逗号,换句话说,我只需要列中的文本,用逗号分隔它们【英文标题】:Removing repeated commas from Pandas Dataframe Column in other words I just need the text from the column with a comma separating them 【发布时间】:2021-11-22 20:35:43 【问题描述】:我有这个带有Text
列的数据框
Text | Cleaned Col |
---|---|
, , , Apples , , , Hard Work , , | Apples, Hard Work |
, , , , , , , , Apples , , , , , | Apples |
Apples , , Watermelon , , , , , , | Apples, Watermelon |
, , , , , , , , , , , , , , , , , |
我想创建一个列,例如Cleaned Col
,主要使用正则表达式。
我查看了不同的模式,例如 r'\s*,*([^(a-zA-Z)]*)'
,但我没有得到正确的结果。
【问题讨论】:
能否请您告知这些字段是否可以包含空格?起初,我认为不可能没有并建议df['Cleaned Col'] = df['Text'].str.findall(r'[^\s,]+').str.join(', ')
,但再想一想,我认为您对问题的输入过于简化了。那么,列中可以有类似, , , Red-green apples , , ,
的值吗?我在答案中添加了这两种解决方案,但很高兴知道您的确切要求。
【参考方案1】:
使用Series.str.findall
获取单词并通过逗号加入:
df['Cleaned Col'] = df['Text'].str.findall('\w+').str.join(', ')
print (df)
Text Cleaned Col
0 , , , Apples , , , Bananas , , , Apples, Bananas
1 , , , , , , , , Apples , , , , , Apples
2 Apples , , Watermelon , , , , , , Apples, Watermelon
3 , , , , , , , , , , , , , , , , ,
【讨论】:
非常感谢!这很有效,而且很简单! @codemunchkin - 超级!所以不可能像red apple
这样的词,它意味着带空格?
抱歉,对于像红苹果这样的例子,我说得太早了,你的解决方案不起作用,它像这个红苹果一样分裂它,但我想要它像红苹果一样
@codemunchkin - 所以只能工作 Wiktor Stribiżew
解决方案。
Jezrael 是的,Wiktor Stribizew 的解决方案奏效了。【参考方案2】:
您可以尝试用空格替换逗号,然后清除左右空格并用逗号替换中间空格:
df['Cleaned Col'] = df['Text'].apply(lambda x: x.replace(',', ' ').lstrip().rstrip().replace(' ', ', ')
【讨论】:
【参考方案3】:由于您的字段以逗号分隔,因此您可以使用
# If the fields CANNOT contain whitespace:
df['Cleaned Col'] = df['Text'].str.findall(r'[^\s,]+').str.join(', ')
# If the fields can contain whitespace:
df['Cleaned Col'] = df['Text'].str.findall(r'[^\s,](?:[^,]*[^\s,])?').str.join(', ')
正则表达式提取所有找到的匹配项,.str.join(', ')
将结果列表项连接成一个字符串。正则表达式 (see its demo) 表示:
[^\s,]+
- 一个或多个字符而不是空格和逗号
[^\s,]
- 一个单个字符而不是空格和逗号
(?:[^,]*[^\s,])?
- 可选出现任何零个或多个除逗号以外的字符,然后是除空格和逗号以外的字符。
如果你的逗号用空格填充并且你真的想使用Series.str.replace
,你可以使用
df['Cleaned Col'] = df['Text'].str.replace(r'^[\s,]+|[\s,]+$|(\s)*(,)[\s,]*', r'\2\1', regex=True)
见this regex demo。
详情:
^[\s,]+
- 字符串开头的一个或多个空格或逗号
[\s,]+$
- 字符串末尾的一个或多个空格或逗号
(\s)*(,)[\s,]*
- 零个或多个空格(最后一个匹配的保留在第 1 组中,\1
),然后是逗号(捕获到第 2 组中,\2
),然后是零个或多个空格或逗号字符。
替换是第 2 组 + 第 1 组的值。
【讨论】:
非常感谢您的详尽解释。此解决方案也有效。感谢您的详细回答,学到了很多新东西!以上是关于从 Pandas Dataframe Column 中删除重复的逗号,换句话说,我只需要列中的文本,用逗号分隔它们的主要内容,如果未能解决你的问题,请参考以下文章
从 Pandas Dataframe Column 中删除重复的逗号,换句话说,我只需要列中的文本,用逗号分隔它们
pandas使用apply函数:在dataframe数据列(column)上施加(apply)函数
pandas改变dataframe索引数据列的数据类型(change the index column data type of pandas dataframe)
遍历 Pandas Dataframe 中定义的日期时间索引范围
pandas基于dataframe特定数据列的指定阈值将原dataframe分割成两个dataframe(split dataframe based on column value threshold