使用按peak_id分组的中位数替换Pandas DataFrame中highpoint_metres缺失值
pandas 缺失值填充实现方案
完整可运行代码(基于你已编写的逻辑扩展)
import pandas as pd members = pd.read_csv("https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-09-22/members.csv") # 你已实现的按peak_id分组计算中位数逻辑 mediane_peak_id = members[["peak_id","highpoint_metres"]].groupby("peak_id",as_index=False).median() # ------------- 新增代码开始 ------------- # 需求1:合并中位数到原表,新增列存储对应peak_id的中位数 members = members.merge(mediane_peak_id, on="peak_id", suffixes=("", "_median")) # 需求2:空值替换,原highpoint_metres为空时用对应中位数填充 members["highpoint_metres"] = members["highpoint_metres"].fillna(members["highpoint_metres_median"]) # 可选:校验填充结果,输出填充后剩余的空值数量 print("填充后highpoint_metres列剩余空值数:", members["highpoint_metres"].isna().sum())
更简便的简化写法(无需单独生成分组中位数表)
可以直接用groupby+transform一步生成中位数列,代码更简洁:
import pandas as pd members = pd.read_csv("https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-09-22/members.csv") # 一步生成对应peak_id的中位数列 members["highpoint_metres_median"] = members.groupby("peak_id")["highpoint_metres"].transform("median") # 空值填充 members["highpoint_metres"] = members["highpoint_metres"].fillna(members["highpoint_metres_median"])
逻辑说明
- 合并/生成的
highpoint_metres_median列即为你需要的每行对应peak_id的highpoint_metres中位数值 fillna()方法会自动识别highpoint_metres的空值,用同索引位置的中位数值替换,非空值不受影响- 若输出的剩余空值数不为0,是因为对应peak_id的所有
highpoint_metres原本都为空,无有效值计算中位数,这类空值需要额外处理
内容的提问来源于stack exchange,提问作者user17555649
相关产品推荐
相关产品推荐

