所以,我有这个巨大的 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 中) )。
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)