如何在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
相关产品推荐
相关产品推荐

