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

Pandas按列索引分组问题:提取列名分组标识并实现分组

问题分析与代码修正

报错原因

你遇到的ValueError: Length of values (1) does not match length of index (8709),核心问题有两个:

  • get_day(a)返回的是和列数等长的列表(比如示例中是['d0','d0','d1','d1']),但你把它包裹在另一个列表里,变成了长度为1的嵌套列表,赋值时Pandas会尝试将其广播到和索引长度(8709)匹配,导致长度不匹配。
  • 你想添加分组标识行,但a["day"] = ...是添加一列,和需求逻辑不符。

代码修正步骤

1. 修正行插入逻辑

用df.loc["行标签"]语法插入新行,替代添加列的错误写法:

a.loc["day"] = get_day(a.columns)

2. 修正分组逻辑

按列分组时,需要传入和列数等长的分组键序列(即刚插入的"day"行的值),而非列名列表:

grouped_obj = a.groupby(a.loc["day"], axis=1)

3. 优化get_day函数(可选)

函数不需要接收整个DataFrame,只需要列名列表即可,逻辑更清晰:

def get_day(cols):
    day_list = []
    for col in cols:
        d, r = col.split("_")
        day_list.append(d)
    return day_list

完整修正后的代码

import pandas as pd

def group(a: pd.DataFrame):
    def get_day(cols):
        day_list = []
        for col in cols:
            d, r = col.split("_")
            day_list.append(d)
        return day_list

    # 添加分组标识行
    a.loc["day"] = get_day(a.columns)
    # 按day行的分组键对列进行分组
    grouped_obj = a.groupby(a.loc["day"], axis=1)
    # 返回带分组行的DataFrame和分组对象,可按需调整返回内容
    return a, grouped_obj

验证效果

假设原DataFrame为:

df = pd.DataFrame({
    "d0_1": [1,2,3],
    "d0_2": [4,5,6],
    "d1_1": [7,8,9],
    "d1_2": [10,11,12]
})

执行函数后,原DataFrame会新增"day"行:

d0_1  d0_2  d1_1  d1_2
0         1     4     7    10
1         2     5     8    11
2         3     6     9    12
day      d0    d0    d1    d1

分组对象可用于后续聚合操作,比如计算同组列的均值:

df, grouped = group(df)
print(grouped.mean())

输出:

d0    d1
0     2.5   8.5
1     3.5   9.5
2     4.5  10.5
day   d0    d1

内容的提问来源于stack exchange,提问作者Sepp Seppel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:40:29