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

pandas中groupby.apply是否有等价于result_type的参数?

在pandas的groupby.apply中模拟result_type的效果

groupby.apply确实没有和DataFrame.apply的result_type参数等价的官方设置,它默认会自动解析返回的字典、列表等结构,生成多级索引或展开列。要避免这种“智能”解析,让每个组的结果保持为函数返回的原始对象(比如字典、列表),可以用以下两种实用方法:

方法1:用容器包裹返回结果

让函数返回的结果被一个列表或元组包裹,这样pandas不会自动展开内部结构,之后再通过explode()提取出原始结果。

示例代码:

import pandas as pd

# 构造测试数据
df = pd.DataFrame({
    'group': ['A', 'A', 'B', 'B'],
    'value': [1, 2, 3, 4]
})

# 处理每组的函数,返回字典
def process_group(g):
    return {
        'total': g['value'].sum(),
        'avg': g['value'].mean(),
        'size': len(g)
    }

# 用列表包裹结果,避免自动展开
result = df.groupby('group').apply(lambda x: [process_group(x)]).explode()
print(result)

输出结果中每个组对应一个字典,不会被展开为多级列:

group
A    {'total': 3, 'avg': 1.5, 'size': 2}
B    {'total': 7, 'avg': 3.5, 'size': 2}
dtype: object

方法2:返回单个值类型的Series

将函数的返回结果(比如字典)作为单个值存入Series,指定一个统一的列名,这样groupby.apply会保留原始对象结构。

示例代码:

def process_group(g):
    return pd.Series([{
        'total': g['value'].sum(),
        'avg': g['value'].mean(),
        'size': len(g)
    }], name='stats')

result = df.groupby('group').apply(process_group)
# 提取结果
final_result = result['stats']
print(final_result)

输出和方法1一致,每个组的结果是原始字典。

如果你的需求是将返回的字典直接作为行数据(而非保留为对象),可以在apply后用pd.DataFrame(result.tolist())来统一转换为DataFrame,这也是一种常见的后续处理方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 10:30:58