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

在Pandas DataFrame中分组计算中位数时给缺失项赋值0的实现

解决方法

要实现计算中位数时给缺失Item补0的需求,可按以下步骤操作:

1. 加载原始数据

先将原始数据转为Pandas DataFrame:

import pandas as pd

# 原始数据
data = [
    ("2021-01-01", "A", 3),
    ("2021-01-01", "B", 2),
    ("2021-01-01", "C", 1),
    ("2021-02-01", "A", 6),
    ("2021-02-01", "B", 4),
    ("2021-03-01", "A", 8)
]
df = pd.DataFrame(data, columns=["Date", "Item", "Price"])

2. 补全缺失Item并填充0

先提取所有唯一的Item,再通过透视表补全每个日期下的所有Item记录,缺失的Price用0填充:

# 获取所有存在的Item
all_items = df["Item"].unique()
# 补全每个日期的Item,缺失Price填0
df_full = (
    df.pivot(index="Date", columns="Item", values="Price")
    .reindex(columns=all_items)
    .fillna(0)
    .stack()
    .reset_index(name="Price")
)

3. 分组计算中位数

基于补全后的数据按日期分组,计算中位数并整理格式:

# 计算中位数
median_result = df_full.groupby("Date")["Price"].median().reset_index()
# 添加Item列标记为Median
median_result["Item"] = "Median"

4. 合并原始数据与中位数结果

将原始数据和中位数行合并,再按日期排序:

# 合并数据
final_df = pd.concat([df, median_result], ignore_index=True)
# 按日期排序,让同一日期的记录聚集在一起
final_df = final_df.sort_values("Date").reset_index(drop=True)

最终输出结果

执行上述代码后,final_df将输出符合需求的内容:

DateItemPrice
2021-01-01A3
2021-01-01B2
2021-01-01C1
2021-01-01Median2
2021-02-01A6
2021-02-01B4
2021-02-01Median4
2021-03-01A8
2021-03-01Median0

核心逻辑说明

  • 补全缺失Item是关键:通过透视表展开所有日期的Item维度,确保计算中位数时包含缺失Item对应的0值,避免默认忽略缺失项导致的结果偏差。
  • 合并后排序保证了数据展示的可读性,同一日期的原始数据与中位数行相邻。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:45:31