如何对pandas分组对象执行列的减法与除法运算?
解决方案
首先纠正你写的groupby语法错误:正确的分组方式是使用括号df.groupby('Name'),而非方括号df.groupby['Name']。
针对你的需求,我们可以通过自定义聚合函数或者分步聚合后计算两种方式实现:
方式一:自定义聚合函数
先定义一个处理每个分组的函数,实现(Col_1总和 - Col_2值) / Col_3值的计算逻辑(假设同一Name分组内的Col_2和Col_3值一致,取组内第一个值即可):
import pandas as pd # 示例数据 df = pd.DataFrame({ 'Name': ['A', 'B', 'B'], 'Col_1': [3, 1, 3], 'Col_2': [5, 6, 6], 'Col_3': [5, 7, 7] }) def compute_metric(group): sum_col1 = group['Col_1'].sum() col2 = group['Col_2'].iloc[0] # 取组内第一个Col_2值 col3 = group['Col_3'].iloc[0] # 取组内第一个Col_3值 return (sum_col1 - col2) / col3 # 应用分组聚合 result_series = df.groupby('Name').apply(compute_metric) print(result_series)
输出结果:
Name A -0.400000 B 0.000000 dtype: float64
方式二:分步聚合后计算
先对分组后的各列分别聚合,再通过算术运算得到最终结果:
# 分组聚合各列 agg_df = df.groupby('Name').agg( sum_col1=('Col_1', 'sum'), col2=('Col_2', 'first'), # 若分组内Col_2值不同,可替换为'sum'/'mean'等 col3=('Col_3', 'first') ) # 计算目标值并转换为Series result_series = (agg_df['sum_col1'] - agg_df['col2']) / agg_df['col3'] print(result_series)
输出结果和方式一完全一致。
补充说明
如果你的场景中同一Name分组内的Col_2或Col_3存在不同值,只需将聚合逻辑中的'first'替换为你需要的统计方式即可(比如'sum'求和、'mean'取平均值等)。
内容的提问来源于stack exchange,提问作者Omri
相关产品推荐
相关产品推荐

