从 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 选择列或者添加列生成新的DataFrame

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