You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 22:06:01