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

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()

有两个关键问题:

  1. 列选择的语法错误:groupby之后选择列应该是单层列表,比如['int1', 'int2', 'string', 'string2'],而不是嵌套的多个列表[['int1'],['int2'],...]。
  2. 直接对列应用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:46:19