CSV中文乱码需用encoding='gbk'或chardet探测;groupby.agg()列名混乱应改用命名聚合;绘图中文不显要设font.sans-serif;大文件内存爆掉须用chunksize分批读取。

读取 CSV 时中文乱码或报 UnicodeDecodeError
Windows 默认用 gbk 编码保存文件,而 Python 3 的 pandas.read_csv() 默认尝试 utf-8,不匹配就直接报错。不是文件坏了,是编码没对上。
- 先试
encoding='gbk'或encoding='gb2312',多数本地 Excel 另存为 CSV 后适用 - 实在不确定,用
open()手动探测:import chardet with open('data.csv', 'rb') as f: print(chardet.detect(f.read(10000)))结果里的'encoding'字段就是该用的值 - 长期协作建议统一导出为 UTF-8 with BOM(Excel 支持),然后固定用
encoding='utf-8-sig',避免 BOM 被当普通字符读入
df.groupby().agg() 返回列名丢失或嵌套层级混乱
新版 pandas(1.3+)默认启用 observed=False 和多级索引折叠逻辑,agg() 若传入字典(如 {'sales': 'sum', 'qty': ['mean', 'count']}),输出列名会变成元组,reset_index() 后也不直观。
- 加参数
as_index=False强制返回 DataFrame 而非 Series - 聚合后立刻用
columns = columns.map('_'.join)展平多级列名(前提是columns.nlevels > 1) - 更稳妥的做法:改用命名聚合
df.groupby('region').agg( total_sales=('sales', 'sum'), avg_qty=('qty', 'mean') )——列名清晰、无嵌套、兼容性好
绘图时中文不显示或坐标轴重叠
matplotlib 默认字体不支持中文,且 plt.xticks() / plt.xlabel() 中文若未设置字体,会显示方块;图表元素挤在一起则常因 figsize 过小或未调用 plt.tight_layout()。
- 全局设字体(推荐):
import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans'] plt.rcParams['axes.unicode_minus'] = False # 解决负号显示为方块
- 单图微调:在
plt.show()前加plt.tight_layout(),或手动设plt.subplots(figsize=(10, 6)) - 导出图片时若仍模糊,加
dpi=300参数:plt.savefig('plot.png', dpi=300, bbox_inches='tight')
内存爆掉:pd.read_csv() 加载大文件卡死
不是代码写错了,是数据量超出了可用内存。常见于几千万行以上、含长文本或未清理空列的 CSV。
立即学习“Python免费学习笔记(深入)”;
- 用
chunksize分批处理:for chunk in pd.read_csv('big.csv', chunksize=50000): process(chunk) # 每次只进内存 5 万行 - 指定
usecols只读需要的列,避免加载冗余字段 - 对数值列提前设
dtype(如{'user_id': 'category', 'score': 'float32'}),能省 30%~70% 内存 - 真要全量加载,考虑换
dask.dataframe或polars,它们天然惰性计算、内存友好
实际项目里,编码、分组、绘图、内存这四类问题占了数据清洗和可视化阶段八成以上的阻塞点。真正难的往往不是“不会写”,而是报错信息没指向真实原因——比如 UnicodeDecodeError 看似编码问题,有时其实是文件末尾多了不可见的 BOM 或控制字符。多看前几十字节的原始二进制,比反复试 encoding 更快。










