【问题标题】:Combining several replace-statements into one in pandas­在熊猫中将几个替换语句组合成一个
【发布时间】:2020-09-07 21:50:30
【问题描述】:

pandas 中有一个DataFrame,见下图

基本上它是从维基百科的文章中抓取的表格:https://de.wikipedia.org/wiki/Liste_der_Gro%C3%9Fst%C3%A4dte_in_Deutschland#Tabelle

为了进一步处理,我正在尝试清理数据。所以,这些语句运作良好

df['Name'] = df['Name'].str.replace('\d+', '')
df['Name'] = df['Name'].str.strip()
df['Name'] = df['Name'].str.replace(',', '')
df['Name'] = df['Name'].str.replace('­-', '')

但是我怎样才能将所有这四个语句合二为一呢?可能使用正则表达式。

我尝试使用df['Name'] = df['Name'].str.replace(r'[\d\-,]+', ''),但没有成功。可能是因为使用了自动换行符。

我想要的输出是" Ber,li-n2 "-> "Berlin"

未知的情况在'Mönchengladbach1, 5'周围发生。

【问题讨论】:

  • df['Name'] = df['Name'].str.replace(r'[\d\-,]+', '') 应该可以工作。或df['Name'] = df['Name'].str.replace(r'[\d,-]+', '').str.strip()
  • df['Name'] = df['Name'].str.replace('(\d+|,|-|<­)', '')
  • 我在答案中将所有 Unicode 破折号添加到解决方案中。
  • 你也可以把-放到Regex-Group中。

标签: python-3.x regex pandas dataframe


【解决方案1】:

您正在删除数据,因此您可以将删除的模式合并为一个单一模式,就像您拥有的模式一样。 r'[\d,-]+' 在风格上稍微好一点。

您可以使用 [\u00AD\u002D\u058A\u05BE\u1400\u1806\u2010-\u2015\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D] 删除任何 dash punctuation + 软连字符 (\u00AD),因此您可能需要将这些代码添加到正则表达式中。

记得将清理后的数据分配回列并添加.str.stip()

你可以使用

df['Name'] = df['Name'].str.replace(r'[\u00AD\u002D\u058A\u05BE\u1400\u1806\u2010-\u2015\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D\d,-]+', '').str.strip()

如果您不想添加 str.strip(),请添加 ^\s+\s+$ 替代正则表达式:

df['Name'] = df['Name'].str.replace(r'^\s+|[\u00AD\u002D\u058A\u05BE\u1400\u1806\u2010-\u2015\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D\d,-]+|\s+$', '')

详情

  • ^\s+ - 字符串开头有 1+ 个空格
  • | - 或
  • [\u002D\u058A\u05BE\u1400\u1806\u2010-\u2015\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D\d,-]+ - 1 个或多个 Unicode 破折号、数字、逗号或 - 字符
  • | - 或
  • \s+$ - 字符串末尾有 1+ 个空格。

【讨论】:

  • 我不知道为什么但它仍然无法与血腥的'Mönchen­gladbach1, 5' 一起使用,请参阅here
  • @Taras 有一个不可见的字符,这里,\u00AD,软连字符,我在答案中添加了它。
  • Dziękuję bardzo!奇迹般有效!你能这么好心告诉我更多关于这个“隐形”字符的信息吗?或向我推荐一个来源。
  • @Taras 我复制了你的字符串并粘贴到r12a.github.io/app-conversion 转换字段中,然后我立即看到了字符及其代码。 \u00AD 属于 \p{Cf} 类别,不知道为什么。
【解决方案2】:

你可以去

df['Name'] = df['Name'].str.replace('(\d+|,|­<|>|-)', '') 

把你要整理的项目放到一个组里,用管道|分隔不同的选项

【讨论】:

  • 我不知道为什么但它仍然无法与血腥的'Mönchen­gladbach1, 5' 一起使用,请参阅here
  • 如果您想要从Mönchen­gladbach1, 5Mönchen­gladbach 的简单转换,此语句有效。但是如果不知道df 的确切输出,很难说它对你的表现如何。看一下链接,我可以看到Mönchengladbach 之间有一个 linbreak。要么将其作为\n 添加到要替换的项目组中,要么将您的 df 放入问题中,以便我们查看它。
猜你喜欢
  • 2013-08-06
  • 2015-01-19
  • 2014-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多