使用Pandas read_table读取带MultiIndex的TSV文件时首行丢失问题
解决pandas read_table读取TSV时首行丢失且KeyError的问题
我碰到过类似的情况,咱们来一步步拆解问题:
问题根源
你用pd.read_table("test.pln", header=[0,1], index_col=0)读取文件时,pandas会把前两行解析为多级列标题,第三行开始是数据。但你访问行0触发KeyError,大概率是因为索引列的类型推断问题:文件里第三行的第一列是0,pandas可能把它解析成了字符串类型的索引值'0',而非整数0,所以你用整数0去查找自然会找不到。
另外你说“首行丢失”,其实那行并没有丢失,只是你用错了索引标签去访问它而已。
解决方案
方案1:用正确的索引标签访问
先确认读取后的索引内容:
import pandas as pd df = pd.read_table("test.pln", header=[0,1], index_col=0) print(df.index)
如果输出里看到'0'(带引号的字符串),直接用字符串标签访问即可:
# 访问那行全为NaN的数据 print(df.loc['0'])
方案2:转换索引类型
如果希望用整数0访问,可以把索引转换为混合类型(整数+字符串):
df.index = pd.to_numeric(df.index, errors='ignore') # 现在就能用整数0访问了 print(df.loc[0])
errors='ignore'会把无法转换为数字的索引值(比如GeneA)保持原样,不影响其他行的访问。
方案3:先读取再设置索引
避免读取时直接指定index_col导致的类型推断问题,先完整读取数据,再手动设置索引:
# 先不指定index_col,读取所有内容 df = pd.read_table("test.pln", header=[0,1]) # 将第一列设置为索引 df = df.set_index(df.columns[0]) # 此时索引类型会更准确,直接用df.loc[0]访问即可
方案4:强制指定索引列类型
读取时通过dtype参数强制索引列的类型,比如设为object(字符串):
df = pd.read_table("test.pln", header=[0,1], index_col=0, dtype={0: object}) # 用字符串'0'访问 print(df.loc['0'])
验证
执行完上述任意方案后,你可以用df.head()查看前几行,就能看到那行全为NaN的数据已经正常加载了。
内容的提问来源于stack exchange,提问作者Kyranstar
相关产品推荐
相关产品推荐

