
KeyError:列名不存在
这是最常遇到的错误,比如写 df['age'] 但实际列名是 'Age' 或 'age_group'。Pandas 区分大小写,且空格、下划线、中英文标点都会导致不匹配。
排查建议:
- 用 df.columns.tolist() 查看真实列名,注意前后空格——可加 .str.strip() 清洗
- 用 df.columns.str.contains('age', case=False) 模糊搜索相关列
- 读取 CSV 时加 skipinitialspace=True 避免列名开头空格
SettingWithCopyWarning:链式赋值警告
当你写类似 df[df['score'] > 80]['grade'] = 'A' 时,Pandas 不确定你是在修改原 DataFrame 还是副本,于是发出警告,后续可能赋值失败。
正确做法:
立即学习“Python免费学习笔记(深入)”;
- 用 .loc 显式定位:df.loc[df['score'] > 80, 'grade'] = 'A'
- 确认操作对象是否为视图(view)或副本(copy),可用 df._is_copy(仅调试用,不推荐依赖)
- 必要时主动复制:df2 = df.copy(),再对 df2 操作
ValueError:长度不匹配(如 cannot set using a list-like indexer with a different length)
常见于赋值时左右两边长度不一致。例如用布尔索引选了 120 行,却试图赋一个长度为 100 的列表。
典型场景和解决方式:
- 赋值前检查长度:len(df[mask]) == len(values)
- 用标量赋值(如 df.loc[mask, 'col'] = 0)最安全,Pandas 会自动广播
- 避免直接对 df[mask]['col'] = ... 赋值——改用 .loc 或 .iloc
TypeError:无法对不可比较类型执行操作
比如对含字符串和 NaN 的列调用 .sum() 或比较 > 5,或日期列被读成 object 类型后做算术运算。
快速修复步骤:
- 查数据类型:df.dtypes,重点关注报错列
- 转类型:数值列用 pd.to_numeric(col, errors='coerce');日期列用 pd.to_datetime(col, errors='coerce')
- 处理缺失值:转换后 NaN 自动产生,再用 .dropna() 或 .fillna() 统一处理
MemoryError 或运行极慢
读大文件或执行 groupby/merge 时容易触发,本质是数据量超出内存承载或算法复杂度高。
轻量级优化方案:
- 读取时限制列:pd.read_csv(file, usecols=['a','b','c'])
- 指定低精度类型:dtype={'user_id': 'category', 'score': 'int32'}
- 分块处理:for chunk in pd.read_csv(file, chunksize=10000): process(chunk)
- 替代 groupby:对超大集合,先 df.sort_values().groupby(..., sort=False) 可提速










