在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将输出符合需求的内容:
| Date | Item | Price |
|---|---|---|
| 2021-01-01 | A | 3 |
| 2021-01-01 | B | 2 |
| 2021-01-01 | C | 1 |
| 2021-01-01 | Median | 2 |
| 2021-02-01 | A | 6 |
| 2021-02-01 | B | 4 |
| 2021-02-01 | Median | 4 |
| 2021-03-01 | A | 8 |
| 2021-03-01 | Median | 0 |
核心逻辑说明
- 补全缺失Item是关键:通过透视表展开所有日期的Item维度,确保计算中位数时包含缺失Item对应的0值,避免默认忽略缺失项导致的结果偏差。
- 合并后排序保证了数据展示的可读性,同一日期的原始数据与中位数行相邻。
内容的提问来源于stack exchange,提问作者Erica Chung
相关产品推荐
相关产品推荐

