【问题标题】:How to remove spaces in between characters without removing ALL spaces in a dataframe?如何删除字符之间的空格而不删除数据框中的所有空格?
【发布时间】:2019-04-24 11:41:42
【问题描述】:

假设我有一个这样的数据框:

ID    Name       Description
0     Manny      V e  r y calm
1     Joey       Keen and a n a l y t i c a l
2     Lisa       R a s h and careless
3     Ash        Always joyful

我想删除Description 列中每个字母之间的所有空格,而不完全删除单词之间的所有必要空格。

在 Pandas 中是否有简单的方法?

【问题讨论】:

  • 被隔开的单词是否总是在字母之间没有空格的单词之后或之前?
  • 没有。它因人而异。有时可能,有时可能不会。 @duncster94
  • 你有可以使用的词汇吗?或者这些词实际上可以是任何东西吗?
  • 它们可以是任何东西。根本没有图案。每个描述都是独一无二的,并且独立于所有其他描述。
  • 我不明白如何做到这一点。例如,字符串 'v e r y c a l m' 不能区分为两个词(无论如何都不能用 Pandas)。

标签: python pandas dataframe


【解决方案1】:

这是一个棘手的问题,但可以让您获得大部分方法的一种方法是使用消极和积极的后向/前瞻来编码一些基本规则。

考虑到您所描述的内容,以下示例可能运行良好。它会错误地将连续“真实”单词中的字符组合成单独的字符,但如果这种情况很少见,这可能会很好。您可以添加额外的规则来涵盖更多的边缘情况。

import re
import pandas as pd

s = pd.Series(['V e  r y calm', 'Keen and a n a l y t i c a l',
'R a s h and careless', 'Always joyful'])

regex = re.compile('(?<![a-zA-Z]{2})(?<=[a-zA-Z]{1}) +(?=[a-zA-Z] |.$)')
s.str.replace(regex, '')

0              Very calm
1    Keen and analytical
2      Rash and careless
3          Always joyful
dtype: object

这个正则表达式有效地说:

查找空格序列并替换空格,但前提是它们之前有一个字母。如果有两个字母,不要做任何事情(即,一个 2 个字母的单词)。但更具体地说,实际上只有在序列中最后一个空格之后有一个字母或任何终止字符串的字符时才替换空格。

【讨论】:

  • 这真是天才。谢谢