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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 16:25:10