1. 环境介绍
- Windows10
- python2.7
- ipython notebook
- pandas
2. 问题描述
- 打开ipython notebook,导入本地csv文件到DataFrame,打印中文乱码,如下图:
df1 = pd.read_csv('20170207.payrecord.csv')
df1.head()
如下图中文显示乱码:
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()
如下图可正常显示中文:
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
网友评论