如何按除首列外的所有列分组并将首列聚合为列表?
问题解决:按指定列分组聚合首列为列表
原始DataFrame
import pandas as pd df = pd.DataFrame({'col_1': ['yes','no'], 'test_1':['a','b'], 'test_2':['a','b']})
需求
按除第一列外的所有列分组,将每组对应的第一列数据聚合为列表,且逻辑需适配多行场景:基于第二列至最后一列的相同分组,合并对应首列数据为列表。
尝试的代码
col_names = df.columns.to_list() df_out = df.groupby([col_names[1:]])[col_names[0]].agg(list)
期望输出的目标DataFrame
df = pd.DataFrame({'col_1': [['yes','no']], 'test_1':['a'], 'test_2':['b']})
修正后的解决方案
你当前的代码问题在于groupby传入了嵌套列表(col_names[1:]本身就是列名列表,不需要再加一层括号),导致分组逻辑出错。修正后代码如下:
import pandas as pd df = pd.DataFrame({'col_1': ['yes','no'], 'test_1':['a','b'], 'test_2':['a','b']}) col_names = df.columns.to_list() # 去掉groupby里多余的括号,直接传入列名列表,再用reset_index还原分组列为普通列 df_out = df.groupby(col_names[1:])[col_names[0]].agg(list).reset_index()
代码说明
groupby(col_names[1:]):直接传入从第二列开始的所有列名作为分组键,无需额外嵌套.reset_index():将分组后的索引(原分组列)还原为普通列,输出结构与期望完全匹配
多行场景验证
扩展测试数据验证适配性:
df = pd.DataFrame({ 'col_1': ['yes','no','maybe','sure'], 'test_1':['a','b','a','b'], 'test_2':['a','b','a','b'] })
运行修正后的代码,输出结果:
col_1 test_1 test_2 0 [yes, maybe] a a 1 [no, sure] b b
完全符合需求:相同test_1+test_2分组下,col_1被聚合为对应列表。
内容的提问来源于stack exchange,提问作者Tonino Fernandez
相关产品推荐
相关产品推荐

