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

如何在Pandas中为同ID的前置行计算Amount的中位数并新增列?

问题描述

现有如下有序的DataFrame:

Index  ID  Amount
1      A   10
2      A   15
3      A   17
4      A   12
5      A   10
6      B   20
7      B   15
...

需要新增一列MedianOfPastElements,用于计算同一ID下当前行之前所有Amount的中位数(第一行无前置数据,结果为空),预期结果如下(注:(PastElements)列仅作说明,无需保留):

Index  ID  Amount  (PastElements)   MedianOfPastElements
1      A   10      ()
2      A   15      (10)             10
3      A   17      (10;15)          12.5
4      A   12      (10;15;17)       15
5      A   10      (10;12;15;17)    13.5  
6      B   20      ()              
7      B   15      (20)             20
...
实现方法

可以通过Pandas的groupby结合expanding和shift方法实现,具体逻辑如下:

  • 按ID分组,确保仅在同一ID范围内计算前置数据的中位数
  • 对Amount列计算扩展中位数(即从组内第一行到当前行的累积中位数)
  • 通过shift(1)将累积中位数结果下移一行,使当前行对应组内之前所有行的中位数,第一行因无前置数据会显示NaN
  • 若需要将NaN替换为空字符串,可额外调用fillna('')处理

示例代码

import pandas as pd

# 构造示例数据
df = pd.DataFrame({
    'ID': ['A', 'A', 'A', 'A', 'A', 'B', 'B'],
    'Amount': [10, 15, 17, 12, 10, 20, 15]
}, index=[1,2,3,4,5,6,7])

# 新增目标列
df['MedianOfPastElements'] = df.groupby('ID')['Amount'].expanding().median().reset_index(level=0, drop=True).shift(1)

# 可选:将NaN替换为空字符串
# df['MedianOfPastElements'] = df['MedianOfPastElements'].fillna('')

print(df)

运行结果

ID  Amount  MedianOfPastElements
1   A      10                   NaN
2   A      15                  10.0
3   A      17                  12.5
4   A      12                  15.0
5   A      10                  13.5
6   B      20                   NaN
7   B      15                  20.0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 11:07:33