关于windows的pandas中文乱码问题

1. 环境介绍

  • Windows10
  • python2.7
  • ipython notebook
  • pandas

2. 问题描述

  • 打开ipython notebook,导入本地csv文件到DataFrame,打印中文乱码,如下图:
df1 = pd.read_csv('20170207.payrecord.csv')
df1.head()

如下图中文显示乱码:


关于windows的pandas中文乱码问题_第1张图片
Paste_Image.png

3. 解决方法

  • 分析:
  • 写转码函数,将Windows系统默认的GBK转UTF8,如下:

import codecs  
  
def ReadFile(filePath,encoding):  
    with codecs.open(filePath,"r",encoding) as f:  
        return f.read()  
def WriteFile(filePath,u,encoding):  
    with codecs.open(filePath,"w",encoding) as f:  
        f.write(u)  
''''' 
定义GBK_2_UTF8方法,用于转换文件存储编码 
'''  
def GBK_2_UTF8(src,dst):  
    content = ReadFile(src,encoding='gbk')  
    WriteFile(dst,content,encoding='utf_8')  
      
  
''''' 
qyx.csv文件使用GBK编码存储,现在将其转为UTF_8存储 
'''  
src = '20170207.payrecord.csv'  
dst = '20170207.payrecord.utf8.csv'  
GBK_2_UTF8(src,dst)  # 转化后的文件名:20170207.payrecord.utf8.csv

  • 使用转码后的文件,导入pandas打开,即可显示中文,如下:
import sys
reload(sys)
sys.setdefaultencoding('utf8')  # 须设置为utf8

df1 = pd.read_csv('20170207.payrecord.utf8.csv')
df1.head()

如下图可正常显示中文:


关于windows的pandas中文乱码问题_第2张图片
Paste_Image.png
  • 感谢csdn作者Oner.wv 贡献的转码函数

4. 其他隐藏问题思考

问题解决,灰常开心,但单列显示或者汇聚发现,立马懵逼了。
如下:文件已经转码为utf8,可以正常打印DataFrame,但仍有打印中文乱码的情况,如:

  • DataFrame单列乱码显示
  • groupby后中文乱码显示

4.1 解决单列显示乱码问题

  • 单列显示已导入的DataFrame,显示乱码:
# 单列显示,中文仍然乱码
df1['学生姓名'].head()
# 输出如下:
0            T2
1             6
2             3
3    娆у竷濂ョ壒鏇�6瀛欏畤鑸�
4    娆у竷濂ョ壒鏇�6瀛欏畤鑸�
Name: 瀛︾敓濮撳悕, dtype: object


# 懵逼了吧,解决方法:须把引用字段加上中括号[] 
df1[['学生姓名']].head()
# 输出如下:
    学生姓名
0   T2
1   6
2   3
3   欧布奥特曼66孙宇航
4   欧布奥特曼66孙宇航

4.2 解决groupby显示中文乱码问题

  • 使用groupby仍显示乱码:

# 使用groupby汇聚,单列和多列汇聚都显示乱码:
df3 = df2['amount'].groupby([df2['province_name'],df2['city_name']]).sum()
df3.head()
# 输出如下:
province_name  city_name
涓婃捣             涓婃捣           2269162.02
浜戝崡             涓存钵               235.00
               涓芥睙                18.00
               淇濆北               560.00
               澶х悊               462.00
Name: amount, dtype: float64



# 解决方法:groupby的被汇聚列,加上中括号 [],如下df2[['amount']]
df3 = df2[['amount']].groupby(df2['province_name']).sum()
df3.head()
# 输出正常:
    amount
province_name   
上海  2269162.02
云南  92570.00
内蒙古 61931.00
北京  642223.36
吉林  210330.00

你可能感兴趣的