用熊猫处理代理人

时间:2017-10-31 13:43:33

标签: python-3.x pandas

保存数据时

data.to_csv(outp_file, encoding='utf-8')

我有时会遇到这样的错误

  

UnicodeEncodeError:' utf-8'编解码器无法对字符进行编码   233-234:代理人不被允许

在python3中,你可以简单地替换这样的字符

>> "abc\udc34xyz".encode('utf-8', 'replace').decode('utf-8')
'abc?xyz'

但是这里有一个包含N行和M列的数据帧。我可以用代理删除行,但跳过整个数据帧并不合适。

问题是我不知道它们在哪些行和哪些列中。

我正在寻找可以按照以下方式应用的解决方案

try:
   data.to_csv(outp_file, encoding='utf-8')
except UnicodeEncodeError:
   # process data and save it without surrogates...

任何帮助?

4 个答案:

答案 0 :(得分:0)

目前还不清楚您的unicode输入是什么样的,也不清楚为什么它们偶尔会有非UTF16代码点需要像DC34这样的低代理。如果您的数据大多符合USASCII,那么iconv可能会提供一种有用的方法来消除不方便的代码点:

$ cat foo1.csv | iconv -c -f utf16 -t latin1 | iconv -f latin1 -t utf8 > foo2.csv

让您的应用程序读取结果输出.csv。

如果您查看iconv --help,您会注意到-c表示丢弃,此外还有其他一些可能有用的丢弃选项。

答案 1 :(得分:0)

您可以自己打开文件来解决此问题:

with open(outp_file, 'w', encoding='utf8', errors='replace') as f:
    data.to_csv(f)

或者如果outp_file是类似文件的对象,您可以手动编写:

outp_file.write(data.to_csv().encode('utf-8', 'replace').decode('utf-8'))

答案 2 :(得分:0)

for col in train.columns:
    if train[col].dtype==object:
        train[col]=train[col].apply(lambda x: np.nan if x==np.nan else str(x).encode('utf-8', 'replace').decode('utf-8'))

尝试一下。对我有用

答案 3 :(得分:0)

尝试一下

for c in data:
    data[c] = [x.encode('utf-16', 'surrogatepass').decode('utf-16') for x in data[c]]