Pandas 按Col1分组用c-(a+b)规则更新指定行Col3值的实现方法
实现该需求的Pandas操作方案
整个需求的核心是按Col1做分组维度的条件计算,仅需修改每个分组下Col2 == 'c'对应行的Col3值,其余行数据保持不变,不需要全表遍历修改,推荐用向量化操作实现,运行效率远高于逐行循环。
涉及的核心Pandas操作
groupby:按唯一的Col1值做数据分组,聚合计算每个分组下Col2为a、b的Col3值总和- 布尔索引(
loc掩码):精准定位到每个分组下Col2 == 'c'的目标行,仅对目标行做值更新,避免误改其他行数据 map:把分组计算得到的a+b总和,按Col1的取值对齐映射到对应的c行位置,完成差值计算
可直接运行的完整示例代码
import pandas as pd # 构建题目中的初始DataFrame df = pd.DataFrame({ "Col1": ["x", "x", "x", "y", "y", "y"], "Col2": ["a", "b", "c", "a", "b", "c"], "Col3": [10, 12, 25, 13, 14, 37] }) # 1. 计算每个Col1分组下a、b行的Col3值之和 ab_total = df[df["Col2"].isin(["a", "b"])].groupby("Col1")["Col3"].sum() # 2. 定位c行位置,完成值更新 c_row_mask = df["Col2"] == "c" df.loc[c_row_mask, "Col3"] = df.loc[c_row_mask, "Col3"] - df.loc[c_row_mask, "Col1"].map(ab_total)
代码运行后的输出结果
和题目期望的输出完全一致:
| Col1 | Col2 | Col3 |
|---|---|---|
| x | a | 10 |
| x | b | 12 |
| x | c | 3 |
| y | a | 13 |
| y | b | 14 |
| y | c | 10 |
注:以上写法为纯向量化实现,无逐行
apply开销,数据量较大时也能保持较快的运行速度。
内容的提问来源于stack exchange,提问作者CrookedNoob
相关产品推荐
相关产品推荐

