如何使用Pandas读取格式异常的宽表CSV文件?
解决Pandas读取特定CSV时的列匹配错误与硬编码问题
哈哈,这种坑我可太熟了!别担心,咱们先搞清楚问题出在哪,再用更优雅的方式解决它。
为什么你的代码会报错?
你遇到的ValueError: Passed header names mismatches usecols,本质是因为:
- 你用
skiprows=[0,1,2,3,4]跳过了前5行,Pandas会把第6行(原文件的第6行,索引为5)当作表头行 - 但你硬编码的
usecols=([0]+ range(2,5))指定的是列索引,而Pandas读取表头后,会用这些列名去匹配你指定的索引,一旦空列(B列)的表头处理逻辑和你预期不符(比如空列的列名是空字符串),就会出现列名和指定索引不匹配的情况。 - 而且硬编码列索引完全不灵活,一旦CSV的列结构微调,代码直接就崩了。
更优雅的解决方案
我给你两种实用的方法,都能避免硬编码,彻底解决报错:
方法1:动态获取有效列名(推荐,精准控制)
先读取表头行确认有效列,再用这些列名读取数据:
import pandas as pd # 第一步:读取表头行(跳过前5行,只读表头) header_row = pd.read_csv('P://mypath/bogus_csv.csv', nrows=0, skiprows=5) # 筛选掉空列的列名(B列对应的列名是空字符串) valid_columns = [col for col in header_row.columns if col.strip() != ''] # 第二步:用有效列名读取数据 my_df = pd.read_csv('P://mypath/bogus_csv.csv', skiprows=5, usecols=valid_columns)
这种方法完全动态,不管CSV里有多少空列,只要列名是空的就会被过滤,再也不用硬编码列索引。
方法2:读取后删除全空列(更简单,适合空列无数据的场景)
如果B列不仅表头空,数据行也全是空的,直接读取所有列再删掉全空列就行:
import pandas as pd # 跳过前5行读取所有列,然后删除全空的列 my_df = pd.read_csv('P://mypath/bogus_csv.csv', skiprows=5).dropna(axis=1, how='all')
这种写法更简洁,Pandas会自动处理表头,然后帮你把完全没有数据的列删掉,省心又省力。
小提示
以后遇到类似的CSV格式问题,先别急着写硬编码的参数,可以先用nrows=0或者nrows=5读取一小部分内容,确认文件的表头、列结构,再针对性处理,能少踩很多坑!
内容的提问来源于stack exchange,提问作者ℕʘʘḆḽḘ
相关产品推荐
相关产品推荐

