如何动态提取Pandas DataFrame滚动子集并计算后写入新DataFrame?
嘿,这事儿用pandas的rolling方法就能轻松搞定!我来一步步给你演示怎么实现滚动提取3行计算平均值,然后把结果存到新DataFrame里。
实现滚动窗口计算平均值
首先,先重现你给出的示例DataFrame:
import pandas as pd import numpy as np # 直接使用你提供的具体数据,保证和示例一致 df_test = pd.DataFrame( [[1,9,0,3,0], [5,4,1,0,3], [9,3,6,3,5], [6,2,5,9,7], [9,0,7,9,5]], columns=['a', 'b', 'c', 'd', 'e'] ) print(df_test)
输出和你给出的完全一致:
a b c d e 0 1 9 0 3 0 1 5 4 1 0 3 2 9 3 6 3 5 3 6 2 5 9 7 4 9 0 7 9 5
核心实现:滚动3行计算平均值
用pandas的rolling(window=3)创建滑动窗口,再调用mean()计算每个窗口的平均值,直接得到新的DataFrame:
# 滚动窗口大小为3,min_periods=3表示只有窗口凑满3行才计算结果 rolling_mean_df = df_test.rolling(window=3, min_periods=3).mean() print("滚动3行的平均值结果:") print(rolling_mean_df)
输出结果解释
因为窗口需要3行数据,所以前两行(索引0、1)没有足够数据,结果为NaN;从索引2开始,每个值都是对应列连续3行的平均值:
a b c d e 0 NaN NaN NaN NaN NaN 1 NaN NaN NaN NaN NaN 2 5.000000 5.333333 2.333333 2.000000 2.666667 3 6.666667 3.000000 4.000000 4.000000 5.000000 4 8.000000 1.666667 6.000000 7.000000 5.666667
可选:允许窗口不满3行时计算
如果你希望前两行也能得到结果(比如索引0用1行的平均值,索引1用前2行的平均值),只需要把min_periods设为1:
rolling_mean_df_full = df_test.rolling(window=3, min_periods=1).mean() print("包含部分窗口的平均值结果:") print(rolling_mean_df_full)
输出:
a b c d e 0 1.000000 9.000000 0.000000 3.000000 0.000000 1 3.000000 6.500000 0.500000 1.500000 1.500000 2 5.000000 5.333333 2.333333 2.000000 2.666667 3 6.666667 3.000000 4.000000 4.000000 5.000000 4 8.000000 1.666667 6.000000 7.000000 5.666667
拓展:其他滚动计算
这个方法不止能算平均值,你还可以轻松实现求和、最大值、最小值等操作,只需要把mean()换成对应的方法:
- 求和:
df_test.rolling(window=3).sum() - 最大值:
df_test.rolling(window=3).max() - 最小值:
df_test.rolling(window=3).min()
内容的提问来源于stack exchange,提问作者eternity1
相关产品推荐
相关产品推荐

