替换熊猫数据框中的特殊字符

Rap*_*des 11 python pandas

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

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

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

我尝试用几种方法替换它(如下),但它们都不起作用。

df.replace(dictionary, regex=True, inplace=True) ###BOTH WITH AND WITHOUT REGEX AND REPLACE
Run Code Online (Sandbox Code Playgroud)

还:

df.udpate(pd.Series(dic))
Run Code Online (Sandbox Code Playgroud)

它们都没有预期的输出,这将使诸如“NÍCOLAS”之类的字符串变成“NICOLAS”。

帮助?

ran*_*mir 12

上的文档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
Run Code Online (Sandbox Code Playgroud)

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

dictionary = {u'í': 'i', u'á': 'a'}
Run Code Online (Sandbox Code Playgroud)

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

dictionary = {'í': 'i', 'á': 'a'}
Run Code Online (Sandbox Code Playgroud)

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

dictionary = {'\xc3\xa1': 'a', '\xc3\xad': 'i'}
Run Code Online (Sandbox Code Playgroud)

这将解释为什么pandas无法替换这些字符。所以,一定在Python 2使用Unicode文字:u'this is unicode string'。

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


Ove*_*ass 7

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

加载数据:

df=pd.read_csv('test.csv', sep=',', low_memory=False, encoding='iso8859_15')
df
Run Code Online (Sandbox Code Playgroud)

结果:

col1    col2
0   he  hello
1   Nícolas shárk
2   welcome yes
Run Code Online (Sandbox Code Playgroud)

创建字典:

dictionary = {'í':'i', 'á':'a'}
Run Code Online (Sandbox Code Playgroud)

代替:

df.replace(dictionary, regex=True, inplace=True)
Run Code Online (Sandbox Code Playgroud)

结果:

 col1   col2
0   he  hello
1   Nicolas shark
2   welcome yes
Run Code Online (Sandbox Code Playgroud)