如何在Pandas的groupby中执行算术运算并赋值到已有DataFrame
问题解决:按ID分组计算新列
con 原代码的问题
- 列名引用错误:
x[var]、x[ave]需改为x['var']、x['ave'],否则会被识别为未定义变量引发报错。 - 方法使用不当:
df["id"].map()是对单个元素做映射,无法匹配分组后的结果结构,且会直接覆盖原DataFrame,而非新增目标列。 - 语法不完整:代码末尾缺少闭合括号,属于基础语法错误。
正确实现方法
推荐用groupby.transform计算分组内的ave总和,能直接在原DataFrame上完成向量化运算,效率更高:
import pandas as pd data = {'id':[1,1,2,2,2,3,3,3], 'var':[10,12,8,11,13,14,15,16], 'ave':[2,2,1,4,3,5,6,8]} df = pd.DataFrame(data) # 计算每个id分组的ave总和,返回与原df同长度的Series ave_sum_per_id = df.groupby('id')['ave'].transform('sum') # 计算con列 df['con'] = df['var'] * (df['ave'] / ave_sum_per_id) # 保留两位小数对齐预期输出 df['con'] = df['con'].round(2) print(df)
输出结果
id var ave con 0 1 10 2 5.00 1 1 12 2 6.00 2 2 8 1 1.00 3 2 11 4 5.50 4 2 13 3 4.88 5 3 14 5 3.68 6 3 15 6 4.74 7 3 16 8 6.74
如果需要用groupby.apply实现(适合更复杂的分组逻辑),可以这样写:
def calculate_con(group): ave_sum = group['ave'].sum() group['con'] = group['var'] * (group['ave'] / ave_sum) return group df = df.groupby('id').apply(calculate_con).reset_index(drop=True) df['con'] = df['con'].round(2)
内容的提问来源于stack exchange,提问作者mehmo
相关产品推荐
相关产品推荐

