Pandas DataFrame groupby分组按公式计算生成NEW行的问询
按Category分组的批量计算实现
计算规则
针对每个Category分组内的同列年份数据,逐列执行运算:
- 取分组内对应列的Math值、English值求和
- 求和结果乘以同列的History值
- 最终乘积除以100,得到该单元格的计算值
可直接运行的代码
import pandas as pd import numpy as np # 匹配示例结构的原始DataFrame df = pd.DataFrame({ "Category": ["A", "A", "A", "B", "B", "B"], "course": ["Math", "English", "History", "Math", "English", "History"], "2010": [981, 14, 22.74, np.nan, np.nan, 22.74], "2011": [21, 1610, 15, np.nan, 1610, np.nan], "2012": [9817, 11487, 12256, 9817, 11, 25] }) def calc_group_data(group): # 提取分组内三类课程的年份列数据 math_row = group[group["course"] == "Math"][["2010", "2011", "2012"]].squeeze() eng_row = group[group["course"] == "English"][["2010", "2011", "2012"]].squeeze() hist_row = group[group["course"] == "History"][["2010", "2011", "2012"]].squeeze() # 按公式计算 calc_res = (math_row + eng_row) * hist_row / 100 # 构造符合输出结构的单行数据 return pd.Series({ "Category": group["Category"].iloc[0], "course": "NEW", **calc_res }) # 分组运算并整理最终输出 result = df.groupby("Category", group_keys=False).apply(calc_group_data).reset_index(drop=True)
结果说明
- 最终输出的DataFrame结构完全匹配预期:共2行,列依次为
Category、course、2010、2011、2012,course列固定值为NEW - 缺失值处理遵循pandas默认规则:参与运算的任意值为
NaN时,对应计算结果自动为NaN,无需额外手动填充 - 可根据业务需求对浮点类型的计算结果做小数位格式化,不改动核心运算逻辑
内容的提问来源于stack exchange,提问作者Samir Hinojosa
相关产品推荐
相关产品推荐

