替换pandas datafram中的特殊字符

2024-06-13 06:50:57 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我有一个巨大的DF,它编码在iso8859_15中。

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

我有钥匙可以在字典里替换它们{'I':'I','a':'a',…}

我试过几种方法来替换它(如下),但都没有成功。

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

另外:

df.udpate(pd.Series(dic))

他们中没有一个有预期的输出,那就是像“NÍCOLAS”这样的字符串变成“NICOLAS”。

帮忙?


Tags: and方法true编码dfdictionary字典名字
3条回答

^{}上的文档指出,您必须提供一个嵌套字典:第一级是列名,您必须为其提供一个第二个带有替换对的字典。

所以,这应该管用:

>>> 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类型在python3中被重命名为str,而python2中的旧str现在在python3中是bytes)。

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

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

multiple repeat at position 2

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

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

相关问题 更多 >