Pandas读取CSV后DataFrame切片异常:单列返回整行内容
Pandas读取CSV切片异常问题排查与解决
问题现象
- 两个CSV文件看起来结构、内容一致,用
pd.read_csv加载成DataFrame后,形状都是(70698, 1426) - 切reference的列,返回的Series里每个元素是单个
numpy.float64数值 - 切result的列,返回的Series里每个元素都是整行数据(类型是Series),根本没法正常对比内容
排查与解决方法
1. 先查result的列索引是不是多层的
有时候读取CSV时,表头行有重复值,或者误设了表头参数,会搞出多层列索引,这时候切列就会返回嵌套结构。
- 验证:跑
print(result_df.columns.nlevels),如果结果大于1,就是多层索引的问题。 - 解决:
- 重新读取时明确指定只取第一行当表头:
result_df = pd.read_csv('result.csv', header=0) - 如果确实是多层表头但不需要,直接把列名扁平化:
result_df.columns = ['_'.join(col) for col in result_df.columns]
- 重新读取时明确指定只取第一行当表头:
2. 核对两个CSV的分隔符是否一致
有可能result.csv用的分隔符和reference不一样,比如reference是逗号,result是制表符,但Pandas自动推断时搞错了,导致所有数据被塞进一列,又通过某种方式凑成了相同的列数,最终切片就出问题。
- 验证:
- 直接看result.csv第一行:
with open('result.csv', 'r') as f: print(f.readline()) - 对比reference.csv的第一行:
with open('reference.csv', 'r') as f: print(f.readline())
- 直接看result.csv第一行:
- 解决:读取时手动指定分隔符,比如确认是逗号就写
pd.read_csv('result.csv', sep=','),是制表符就用sep='\t'
3. 检查索引设置是否出错
读取result.csv时如果错设了index_col参数,会把索引当成列,或者把数据列当成索引,导致切片异常。
- 验证:看看
result_df.index有没有奇怪的内容,或者跑result_df.dtypes,如果大部分列类型是object,大概率是整行数据被存成了对象。 - 解决:读取时明确不让Pandas自动设索引:
result_df = pd.read_csv('result.csv', index_col=None)
4. 检查CSV文件是否格式损坏
比如result.csv里有些行引号没闭合,或者有多余的换行符,Pandas解析时就会把整行当成单个单元格,加载后就出现嵌套的Series。
- 验证:用文本编辑器打开result.csv,检查前后几行的格式;或者跳过错误行试试:
pd.read_csv('result.csv', error_bad_lines=False),看能不能正常加载。 - 解决:
- 手动修复CSV的格式问题,比如闭合引号、删掉多余换行符;
- 或者读取时禁用引号解析(需要先导入csv模块):
import csv result_df = pd.read_csv('result.csv', quoting=csv.QUOTE_NONE)
内容的提问来源于stack exchange,提问作者Bernd Wechner
相关产品推荐
相关产品推荐

