如何从CSV读取含多级索引列的DataFrame并正常执行groupby?
解决多级索引列DataFrame读取CSV后groupby失败的问题
问题根源
当你向带有多级索引列的DataFrame添加单级列"C"时,pandas会将该列存储为多级索引的一部分,其二级索引值为NaN。保存到CSV文件后,这个NaN会被转为空字符串;重新读取时,pandas会为该空字符串自动分配类似Unnamed: 5_level_1的二级索引标签。此时执行groupby("C")会报错,因为pandas无法识别你要按哪个维度分组——"C"是多级索引的一级名称,而非一维列名。
解决方案
方案1:使用完整的列名元组进行分组
读取后先查看"C"列的完整多级索引名称:
print(df2.columns)
输出中会包含类似('C', 'Unnamed: 5_level_1')的元组,直接用这个元组作为分组依据:
df2.groupby(('C', 'Unnamed: 5_level_1')).sum()
注意:该方案依赖CSV中列的位置,若列顺序变化,Unnamed后的数字可能改变,稳定性较差。
方案2:清理列索引,统一"C"列的二级索引
将"C"列的二级索引改为固定值(如空字符串),再用元组分组:
# 重新构造列索引 new_columns = [] for col in df2.columns: if col[0] == 'C': new_columns.append(('C', '')) # 将二级索引设为空字符串 else: new_columns.append(col) df2.columns = pd.MultiIndex.from_tuples(new_columns) # 现在可以用固定元组分组 df2.groupby(('C', '')).sum()
方案3:提取"C"列的数值序列作为分组依据
利用xs方法提取一级索引为"C"的列,再取其值作为分组键:
# 提取"C"列对应的序列 c_values = df2.xs('C', level=0, axis=1).iloc[:, 0] # 基于该序列分组求和 result = df2.groupby(c_values).sum()
该方案无需修改列索引,直接使用列内数值进行分组,稳定性更好。
方案4:读取CSV时手动指定列索引
读取时先按单级索引读取,再手动构造多级索引,将"C"列设为统一的多级格式:
# 先按单级索引读取 df2 = pd.read_csv("test.csv", index_col=0) # 手动构造列索引 cols = [('A', 'x'), ('A', 'y'), ('B', 'x'), ('B', 'y'), ('C', '')] df2.columns = pd.MultiIndex.from_tuples(cols) # 分组求和 df2.groupby(('C', '')).sum()
内容的提问来源于stack exchange,提问作者voiDnyx
相关产品推荐
相关产品推荐

