【问题标题】:Replacing special characters in pandas dataframe替换熊猫数据框中的特殊字符
【发布时间】:2017-08-09 16:52:33
【问题描述】:

所以,我有这个用 iso8859_15 编码的巨大 DF。

我有几列包含巴西的名称和地点,因此其中一些包含特殊字符,例如“í”或“Ô”。

我有在字典中替换它们的钥匙 {'í':'i', 'á':'a', ...}

我尝试了几种替换它的方法(如下),但都没有奏效。

df.replace(dictionary, regex=True, inplace=True) ###BOTH WITH AND WITHOUT REGEX AND REPLACE

还有:

df.udpate(pd.Series(dic))

它们都没有预期的输出,例如“NÍCOLAS”这样的字符串会变成“NICOLAS”。

帮助?

【问题讨论】:

  • 您最初是如何提取数据的? CSV?
  • 是的。这是一个 CSV。 df=pd.read_csv('file.csv', sep='\t', low_memory=False, encoding='iso8859_15')
  • 这一定与编码有关,因为df.replace(dictionary, regex=True) 有效。

标签: python pandas


【解决方案1】:

pandas.DataFrame.replace 上的文档说您必须提供一个嵌套字典第一级是列名,您必须为其提供第二个带有替换对的字典

所以,这应该可行:

>>> df=pd.DataFrame({'a': ['NÍCOLAS','asdč'], 'b': [3,4]})
>>> df
         a  b
0  NÍCOLAS  3
1     asdč  4

>>> df.replace({'a': {'č': 'c', 'Í': 'I'}}, regex=True)
         a  b
0  NICOLAS  3
1     asdc  4

编辑。 似乎pandas 也接受非嵌套翻译字典。在这种情况下,问题可能出在 字符编码尤其是如果您使用 Python 2。假设您的 CSV 加载函数正确解码了文件字符(作为真正的 Unicode 代码点),那么您应该注意您的翻译/替换字典也使用 Unicode 字符定义,如下所示:

dictionary = {u'í': 'i', u'á': 'a'}

如果你有这样的定义(并且使用 Python 2):

dictionary = {'í': 'i', 'á': 'a'}

那么该字典中的实际键是多字节字符串。它们是哪些字节(字符)取决于使用的实际源文件字符编码,但假设你使用 UTF-8,你会得到:

dictionary = {'\xc3\xa1': 'a', '\xc3\xad': 'i'}

这可以解释为什么pandas 无法替换这些字符。因此,请务必在 Python 2 中使用 Unicode 文字:u'this is unicode string'

另一方面,在 Python 3 中,所有字符串都是 Unicode 字符串,并且您不必使用 u 前缀(实际上 Python 2 中的 unicode 类型在 Python 3 中被重命名为 str ,而 Python 2 中的旧 str 现在是 Python 3 中的 bytes

【讨论】:

  • 嗯,没必要 - 删除嵌套的字典和相同的结果。我认为编码存在一些问题:(
  • 嗯,你说得对,它似乎有效.. 但他们不是在文档中说它必须是嵌套字典吗?
  • 如果需要仅替换列 a 和列 b 无法替换字符串,则使用嵌套列表。所以像df[['a']] = df[['a']].replace(...) 这样的子集可以使用嵌套字典。
  • 是的。尝试使用嵌套在整个 df 中,并且输出是相同的。然后我尝试对特定列执行相同的操作。也不好。
  • 就是这样!刚刚在 Python3 中做到了。 df.replace(dictionary, regex=True, inplace=True)。如果没有就地,它将无法工作
【解决方案2】:

replace 开箱即用,无需在 Python 3 中指定特定列。

加载数据:

df=pd.read_csv('test.csv', sep=',', low_memory=False, encoding='iso8859_15')
df

结果:

col1    col2
0   he  hello
1   Nícolas shárk
2   welcome yes

创建字典:

dictionary = {'í':'i', 'á':'a'}

替换:

df.replace(dictionary, regex=True, inplace=True)

结果:

 col1   col2
0   he  hello
1   Nicolas shark
2   welcome yes

【讨论】:

  • 我尝试了两种方式(有和没有 regex=True,有和没有 inplace=True)。他们都没有工作:(
  • 输出和输入一样吗?还是它与输入不同,只是不是您的预期?
  • @CameronTaylor - 你在 python2 中测试它吗? because
  • 是的!它是。但它在 Python3 中工作 :) 必须使用就地,虽然
  • 很高兴它成功了!是的,在我的示例中,我只是将其打印出来,所以我没有包含inplace。为了完整起见,我会添加它。
【解决方案3】:

如果有人收到以下错误信息

在位置 2 多次重复

试试这个df.replace(dictionary, regex=False, inplace=True)

而不是 df.replace(dictionary, regex=True, inplace=True)

【讨论】:

    猜你喜欢
    • 2022-07-22
    • 2018-02-02
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 2021-03-29
    • 2018-08-01
    相关资源
    最近更新 更多