如何在分组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
相关产品推荐
相关产品推荐

