DataFrame分组聚合报错:'Series' object has no attribute 'columns'求助
Pandas分组聚合报错解决方案
嗨,我来帮你搞定这个分组聚合的问题!先理清楚你的需求:你需要把相同id、userid、string3的行,把int1、int2、string、string2这几列分别合并成列表,其他列保持不变。
你之前尝试拆分DataFrame再合并的方法,对于大数据集确实效率低下,改用groupby是正确的思路,但你的代码写法有问题,导致了AttributeError: 'Series' object has no attribute 'columns'这个错误。
错误原因分析
你写的这段代码:
df = df.groupby(['id','userid','string3']).[['int1'],['int2'],['string'],['string2']].apply(list).reset_index()
有两个关键问题:
- 列选择的语法错误:
groupby之后选择列应该是单层列表,比如['int1', 'int2', 'string', 'string2'],而不是嵌套的多个列表[['int1'],['int2'],...]。 - 直接对列应用
apply(list)会把每一列单独处理成Series,后续无法正确还原成DataFrame结构,从而触发属性错误。
正确的解决方案
推荐用agg方法来指定每个列的聚合方式,这是最简洁高效的写法,适合大数据集:
import pandas as pd # 你的原始DataFrame df = pd.DataFrame({ 'id': [1,1,1], 'userid': [90,90,90], 'int1': [5067,6945,9596], 'int2': [1000,1000,1010], 'string': ['aaa','bbb','ccc'], 'string2': ['100','101','102'], 'string3': ['qqq','qqq','qqq'] }) # 正确的分组聚合代码 result_df = df.groupby(['id', 'userid', 'string3']).agg({ 'int1': list, 'int2': list, 'string': list, 'string2': list }).reset_index() print(result_df)
运行后就能得到你想要的结果:
id userid string3 int1 int2 string string2
0 1 90 qqq [5067, 6945, 9596] [1000, 1000, 1010] [aaa, bbb, ccc] [100, 101, 102]
如果你一定要用apply方法,也可以这样写(不过agg更高效):
def aggregate_group(group): return pd.Series({ 'int1': group['int1'].tolist(), 'int2': group['int2'].tolist(), 'string': group['string'].tolist(), 'string2': group['string2'].tolist() }) result_df = df.groupby(['id', 'userid', 'string3']).apply(aggregate_group).reset_index()
这个方法通过自定义函数,对每个分组的DataFrame进行处理,返回一个包含聚合后列的Series,就能正确生成目标结构了。
内容的提问来源于stack exchange,提问作者Saraaa
相关产品推荐
相关产品推荐

