Python DataFrame:按ID填充缺失值后分组聚合Cost
问题说明
现有包含ID、value、Cost三列的DataFrame,部分ID对应的value为N/A,需完成以下操作:
- 若某
ID存在非N/A的value(统一为"value"),将该ID所有行的value设为"value"; - 按
ID和value分组对Cost求和,同时移除value仍为N/A的行。
初始数据
| ID | value | Cost |
|---|---|---|
| ID-1 | value | 50 |
| ID-2 | N/A | 20 |
| ID-2 | value | 10 |
| ID-1 | N/A | 40 |
| ID-3 | N/A | 30 |
| ID-4 | N/A | 100 |
| ID-2 | value | 10 |
填充缺失值的实现
通过groupby结合transform可以高效完成按ID填充的需求,代码如下:
import pandas as pd # 构造初始DataFrame(已有数据可跳过此步) data = [ ["ID-1", "value", 50], ["ID-2", "N/A", 20], ["ID-2", "value", 10], ["ID-1", "N/A", 40], ["ID-3", "N/A", 30], ["ID-4", "N/A", 100], ["ID-2", "value", 10] ] df = pd.DataFrame(data, columns=["ID", "value", "Cost"]) # 将字符串"N/A"转为pandas可识别的缺失值 df["value"] = df["value"].replace("N/A", pd.NA) # 按ID分组,用组内非缺失值填充整组的value df["value"] = df.groupby("ID")["value"].transform( lambda x: x.dropna().unique()[0] if not x.dropna().empty else pd.NA ) # 转回字符串"N/A"保持格式一致(可选) df["value"] = df["value"].fillna("N/A")
逻辑说明
- 按
ID分组后,过滤每组内的缺失值; - 若组内存在非缺失值(即"value"),用该值覆盖整组的
value; - 若组内全为缺失值,则保留
N/A状态。
填充后中间结果
| ID | value | Cost |
|---|---|---|
| ID-1 | value | 50 |
| ID-2 | value | 20 |
| ID-2 | value | 10 |
| ID-1 | value | 40 |
| ID-3 | N/A | 30 |
| ID-4 | N/A | 100 |
| ID-2 | value | 10 |
聚合与过滤
使用给定的分组聚合代码,再移除value为N/A的行:
# 分组求和 df = df.groupby(["ID", "value"], as_index=False).agg({'Cost': 'sum'}) # 过滤掉value仍为N/A的行 df = df[df["value"] != "N/A"]
最终聚合结果
| ID | value | Cost |
|---|---|---|
| ID-1 | value | 90 |
| ID-2 | value | 40 |
内容的提问来源于stack exchange,提问作者N1ckson
相关产品推荐
相关产品推荐

