使用 pandas 滚动的数据帧所有值的实际平均值
Real average on all values of a dataframe using rolling with pandas
如果我有这样的 df:
a001 a002
1 1
NaN 7
NaN NaN
NaN 3
NaN NaN
2 2
NaN 6
如果我想计算 2 行的 window 的平均值,我可以使用这个:
df['rolling_mean'] = df.mean(axis=1).rolling(window=2, min_periods=1).mean()
哪个returns:
a001 a002 rolling_mean
0 1.0 1.0 1.0
1 NaN 7.0 4.0
2 NaN NaN 7.0
3 NaN 3.0 3.0
4 NaN NaN 3.0
5 2.0 2.0 2.0
6 NaN 6.0 4.0
这是 window 两行的平均值,使用单行元素的平均值。因此,例如第 1 行 (4) 中的 rolling_mean
是第 0 行 (1+1)/2 = 1
的平均值与第 1 行 (7) 的值之间的平均值:(1+7)/2 = 4
如果我想要取前两行中这 3 个值的平均值,结果应该是:(1+1+7)/3 = 3
。
为了获得它,我使用了这个:
df2 = df.copy()
df['sum'] = df2.sum(axis=1).rolling(window=1, min_periods=1).mean()
df['count'] = df2.count(axis=1).rolling(window=1, min_periods=1).mean()
df['last_2'] = df['sum'].rolling(window=2, min_periods=1).sum() / df['count'].rolling(window=2, min_periods=1).sum()
那 returns 我想要的输出:
a001 a002 sum count last_2
0 1.0 1.0 2.0 2.0 1.000000
1 NaN 7.0 7.0 1.0 3.000000
2 NaN NaN NaN 0.0 7.000000
3 NaN 3.0 3.0 1.0 3.000000
4 NaN NaN NaN 0.0 3.000000
5 2.0 2.0 4.0 2.0 2.000000
6 NaN 6.0 6.0 1.0 3.333333
我的问题是:是否有更优雅和 pythonic 的方式来做到这一点?谢谢
对于我来说工作:
df['last_2'] = (df.sum(axis=1).rolling(window=2, min_periods=1).sum() /
df.count(axis=1).rolling(window=2, min_periods=1).sum())
print (df)
a001 a002 last_2
0 1.0 1.0 1.000000
1 NaN 7.0 3.000000
2 NaN NaN 7.000000
3 NaN 3.0 3.000000
4 NaN NaN 3.000000
5 2.0 2.0 2.000000
6 NaN 6.0 3.333333
如果我有这样的 df:
a001 a002
1 1
NaN 7
NaN NaN
NaN 3
NaN NaN
2 2
NaN 6
如果我想计算 2 行的 window 的平均值,我可以使用这个:
df['rolling_mean'] = df.mean(axis=1).rolling(window=2, min_periods=1).mean()
哪个returns:
a001 a002 rolling_mean
0 1.0 1.0 1.0
1 NaN 7.0 4.0
2 NaN NaN 7.0
3 NaN 3.0 3.0
4 NaN NaN 3.0
5 2.0 2.0 2.0
6 NaN 6.0 4.0
这是 window 两行的平均值,使用单行元素的平均值。因此,例如第 1 行 (4) 中的 rolling_mean
是第 0 行 (1+1)/2 = 1
的平均值与第 1 行 (7) 的值之间的平均值:(1+7)/2 = 4
如果我想要取前两行中这 3 个值的平均值,结果应该是:(1+1+7)/3 = 3
。
为了获得它,我使用了这个:
df2 = df.copy()
df['sum'] = df2.sum(axis=1).rolling(window=1, min_periods=1).mean()
df['count'] = df2.count(axis=1).rolling(window=1, min_periods=1).mean()
df['last_2'] = df['sum'].rolling(window=2, min_periods=1).sum() / df['count'].rolling(window=2, min_periods=1).sum()
那 returns 我想要的输出:
a001 a002 sum count last_2
0 1.0 1.0 2.0 2.0 1.000000
1 NaN 7.0 7.0 1.0 3.000000
2 NaN NaN NaN 0.0 7.000000
3 NaN 3.0 3.0 1.0 3.000000
4 NaN NaN NaN 0.0 3.000000
5 2.0 2.0 4.0 2.0 2.000000
6 NaN 6.0 6.0 1.0 3.333333
我的问题是:是否有更优雅和 pythonic 的方式来做到这一点?谢谢
对于我来说工作:
df['last_2'] = (df.sum(axis=1).rolling(window=2, min_periods=1).sum() /
df.count(axis=1).rolling(window=2, min_periods=1).sum())
print (df)
a001 a002 last_2
0 1.0 1.0 1.000000
1 NaN 7.0 3.000000
2 NaN NaN 7.000000
3 NaN 3.0 3.000000
4 NaN NaN 3.000000
5 2.0 2.0 2.000000
6 NaN 6.0 3.333333