Python数据分析项目复盘_常见问题与解决思路【教程】

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。

  • chunksize 分批处理:
    for chunk in pd.read_csv('big.csv', chunksize=50000):
        process(chunk)  # 每次只进内存 5 万行
  • 指定 usecols 只读需要的列,避免加载冗余字段
  • 对数值列提前设 dtype(如 {'user_id': 'category', 'score': 'float32'}),能省 30%~70% 内存
  • 真要全量加载,考虑换 dask.dataframepolars,它们天然惰性计算、内存友好

实际项目里,编码、分组、绘图、内存这四类问题占了数据清洗和可视化阶段八成以上的阻塞点。真正难的往往不是“不会写”,而是报错信息没指向真实原因——比如 UnicodeDecodeError 看似编码问题,有时其实是文件末尾多了不可见的 BOM 或控制字符。多看前几十字节的原始二进制,比反复试 encoding 更快。