如何在Pandas DataFrame中从A列生成B列并计算滚动中位数?
Pandas实现滚动中位数及列转换方案
一、从A列生成B列的实现(匹配配图逻辑)
根据需求,配图中的B列应该是窗口大小为3的滚动中位数(即每个位置取当前行及前两行的中位数,前两个位置因数据不足填充NaN)。可以通过两种方式生成:
方式1:手动循环计算(便于理解逻辑)
import pandas as pd import numpy as np # 示例DataFrame df = pd.DataFrame({'A': [1, 3, 5, 2, 4, 6]}) # 初始化B列为NaN df['B'] = np.nan # 从第3行(索引2)开始计算窗口中位数 for idx in range(2, len(df)): window_data = df['A'].iloc[idx-2:idx+1] df['B'].iloc[idx] = window_data.median()
方式2:Pandas滚动窗口直接生成(高效简洁)
df['B'] = df['A'].rolling(window=3, min_periods=3).median()
二、计算滚动中位数的替代方案
如果核心需求是计算A列的滚动中位数,除了生成B列的方式,还有这些更灵活高效的替代方法:
调整窗口参数适配不同场景:
若允许窗口数据不足时计算(比如前两行也返回对应长度的中位数),修改min_periods参数:# 窗口大小3,至少1个数据就计算中位数 df['rolling_median_flex'] = df['A'].rolling(window=3, min_periods=1).median()自定义加权滚动中位数:
如果需要给窗口内不同位置的数据赋予权重(比如近期数据权重更高),用rolling().apply()配合自定义函数:def weighted_median(window): # 给窗口内最后一个元素(最新数据)最高权重,依次递减 weights = np.array([1, 2, 3]) return np.median(np.repeat(window, weights)) df['weighted_rolling_median'] = df['A'].rolling(window=3, min_periods=3).apply(weighted_median)结合第三方库优化计算:
对于超大数据集,可使用scipy的中位数函数提升性能:from scipy.stats import median df['rolling_median_scipy'] = df['A'].rolling(window=3, min_periods=3).apply(median)
内容的提问来源于stack exchange,提问作者Abhinav Khandelwal
相关产品推荐
相关产品推荐

