You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的行。

初始数据

IDvalueCost
ID-1value50
ID-2N/A20
ID-2value10
ID-1N/A40
ID-3N/A30
ID-4N/A100
ID-2value10

填充缺失值的实现

通过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状态。

填充后中间结果

IDvalueCost
ID-1value50
ID-2value20
ID-2value10
ID-1value40
ID-3N/A30
ID-4N/A100
ID-2value10

聚合与过滤

使用给定的分组聚合代码,再移除value为N/A的行:

# 分组求和
df = df.groupby(["ID", "value"], as_index=False).agg({'Cost': 'sum'})
# 过滤掉value仍为N/A的行
df = df[df["value"] != "N/A"]

最终聚合结果

IDvalueCost
ID-1value90
ID-2value40

内容的提问来源于stack exchange,提问作者N1ckson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 04:42:53