Pandas2.2 DataFrame
Function application, GroupBy & window
方法 | 描述 |
---|---|
DataFrame.apply(func[, axis, raw, …]) | 用于沿 DataFrame 的轴(行或列)应用一个函数 |
DataFrame.map(func[, na_action]) | 用于对 DataFrame 的每个元素应用一个函数 |
DataFrame.applymap(func[, na_action]) | 用于对 DataFrame 中的每一个元素应用一个函数 |
DataFrame.pipe(func, *args, **kwargs) | 用于实现链式编程风格的方法 |
DataFrame.agg([func, axis]) | 用于对 DataFrame 的数据进行聚合操作 |
DataFrame.aggregate([func, axis]) | 用于对 DataFrame 进行聚合操作的方法 |
DataFrame.transform(func[, axis]) | 用于对 DataFrame 的列或行应用函数 |
DataFrame.groupby([by, axis, level, …]) | 用于进行分组操作的核心方法 |
DataFrame.rolling(window[, min_periods, …]) | 用于在 DataFrame 上创建滑动窗口对象 |
pandas.DataFrame.rolling()
pandas.DataFrame.rolling()
用于在 DataFrame 上创建滑动窗口对象,支持对窗口内的数据应用聚合函数(如均值、求和等)。以下是详细说明及示例:
语法
DataFrame.rolling(
window, # 窗口大小(观测数量或时间间隔)
min_periods=None, # 窗口内最小非NaN数据量(默认等于window)
center=False, # 是否居中窗口(默认窗口向后对齐)
win_type=None, # 窗口类型(如 'triang', 'gaussian' 等)
on=None, # 对指定列(时间序列)应用窗口
axis=0, # 轴向:0(按列滑动),1(按行滑动)
closed=None, # 窗口闭合方式:'left', 'right', 'both', 'neither'
step=None, # 窗口步长(滑动间隔)
method='single' # 多列计算方式:'single' 或 'table'
)
示例
示例 1:基本滑动窗口(计算移动平均)
import pandas as pd
df = pd.DataFrame({'Value': [1, 2, 3, 4, 5]})
# 窗口大小为3,计算移动平均
rolling_mean = df.rolling(window=3).mean()
print(rolling_mean)
输出:
Value
0 NaN
1 NaN
2 2.0
3 3.0
4 4.0
解释:
- 窗口大小为3,前两个位置(索引0、1)数据不足,结果为NaN。
- 索引2的结果为前3个值的均值:
(1+2+3)/3 = 2.0
。
示例 2:居中窗口(center=True
)
# 居中窗口,窗口大小为3
rolling_mean_centered = df.rolling(window=3, center=True).mean()
print(rolling_mean_centered)
输出:
Value
0 NaN
1 2.0
2 3.0
3 4.0
4 NaN
解释:
- 窗口以当前行为中心,前后各取1个值(总宽度3)。
- 索引0和4因数据不足为NaN。
示例 3:使用窗口类型(win_type
)
# 使用高斯加权窗口(窗口大小5,标准差0.6)
rolling_gaussian = df.rolling(window=5, win_type='gaussian').mean(std=0.6)
print(rolling_gaussian)
输出:
Value
0 NaN
1 NaN
2 NaN
3 NaN
4 3.00000
解释:
- 窗口大小为5,前4个位置数据不足,结果为NaN。
- 索引4的结果为加权平均(权重由高斯函数生成)。
示例 4:时间序列窗口(on
参数)
# 创建时间序列数据
date_rng = pd.date_range(start='2023-01-01', periods=5, freq='D')
df_time = pd.DataFrame({'Date': date_rng, 'Value': [1, 2, 3, 4, 5]})
# 按时间窗口(2天)计算均值
rolling_time = df_time.rolling(window='2D', on='Date').mean()
print(rolling_time)
输出:
Date Value
0 2023-01-01 1.0
1 2023-01-02 1.5
2 2023-01-03 2.5
3 2023-01-04 3.5
4 2023-01-05 4.5
解释:
- 窗口按时间跨度(2天)滑动。
- 例如,索引1的均值为
(1+2)/2 = 1.5
。
示例 5:按行滑动(axis=1
)
df_row = pd.DataFrame([[1, 2, 3], [4, 5, 6]])
# 横向滑动窗口(窗口大小2)
rolling_row = df_row.rolling(window=2, axis=1).sum()
print(rolling_row)
输出:
0 1 2
0 NaN 3.0 5.0
1 NaN 9.0 11.0
解释:
- 按行横向滑动,窗口大小为2。
- 例如,第0行的结果:
NaN
(窗口不足),1+2=3
,2+3=5
。
示例 6:自定义聚合函数
# 计算窗口内最大值与最小值的差值
df = pd.DataFrame({'Value': [2, 5, 3, 8, 1]})
rolling_range = df.rolling(window=3).apply(lambda x: x.max() - x.min())
print(rolling_range)
输出:
Value
0 NaN
1 NaN
2 3.0
3 5.0
4 7.0
解释:
- 窗口大小为3。
- 索引2的结果:
max(2,5,3)=5
,min=2
,差值3
。
注意事项
- 窗口大小:若
window
为偶数且center=True
,窗口会向前多取一个值。 - 时间序列窗口:使用
on
参数时,需要指定时间列。 - 缺失值处理:通过
min_periods
控制允许的最小非NaN数据量。 - 窗口类型:如
win_type='gaussian'
需配合std
参数指定标准差。