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

如何在分组pd.DataFrame中对多列pd.Series应用自定义函数?

解决分组后对多列Series应用自定义函数的问题

你遇到的核心问题是groupby.apply默认逐行处理,而你需要对每个分组的整列col1和col2应用函数。以下是两种可行的解决方案:

方案1:修改自定义函数以接收分组DataFrame

直接让函数接收整个分组的DataFrame,从中提取整列进行计算,逻辑更直观且效率更高:

import pandas as pd

df = pd.DataFrame.from_dict({
    'group_var':[1,1,1,1,2,2,2,2,3,3,3,3],
    'col1':[1,2,1,1,2,1,3,1,3,1,1,2],
    'col2':[1,2,1,2,1,2,1,3,1,3,1,3]
})

def f(group):
    col1_sum = group['col1'].sum()
    # 直接对col2整列做向量运算,替代列表推导更高效
    return group['col2'] + col1_sum

# 应用函数并重置索引匹配原DataFrame
result = df.groupby('group_var').apply(f).reset_index(drop=True)
print(result)

输出结果完全符合你的期望:

0     6
1     7
2     6
3     7
4     8
5     9
6     8
7    10
8     8
9    10
10    8
11    10
dtype: int64

方案2:保留原函数,通过lambda传递整列

如果你不想修改原函数f,可以通过lambda表达式将分组的col1和col2整列传入:

def f(col1, col2):
    new_col = pd.Series([val + sum(col1) for val in col2])
    return new_col

result = df.groupby('group_var').apply(lambda g: f(g['col1'], g['col2'])).reset_index(drop=True)
print(result)

关键说明

  • 避免使用apply(axis=1),这会强制逐行处理,无法获取整列Series
  • groupby.apply默认会将每个分组的DataFrame传入函数,利用这一点就能拿到整列数据
  • 最后用reset_index(drop=True)是为了让分组计算后的结果索引与原DataFrame对齐

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 21:33:17