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
相关产品推荐
相关产品推荐

