【发布时间】:2017-02-07 08:58:51
【问题描述】:
我有一个熊猫系列:
0 1
1 5
2 20
3 -1
假设我想在每两个元素上应用mean(),所以我得到这样的结果:
0 3.0
1 9.5
有没有优雅的方法来做到这一点?
【问题讨论】:
-
我已经更新了我的帖子。
标签: python pandas group-by mean series
我有一个熊猫系列:
0 1
1 5
2 20
3 -1
假设我想在每两个元素上应用mean(),所以我得到这样的结果:
0 3.0
1 9.5
有没有优雅的方法来做到这一点?
【问题讨论】:
标签: python pandas group-by mean series
你可以用groupby除以index除以k=2:
k = 2
print (s.index // k)
Int64Index([0, 0, 1, 1], dtype='int64')
print (s.groupby([s.index // k]).mean())
name
0 3.0
1 9.5
【讨论】:
reset_index - s = s[-m:].reset_index(drop=True) 然后使用print (s.groupby([s.index // k]).mean())
如果您在大型系列中多次使用此方法,则需要考虑一种快速方法。此解决方案使用所有 numpy 函数,速度很快。
使用reshape 并构造新的pd.Series
考虑pd.Seriess
s = pd.Series([1, 5, 20, -1])
泛化函数
def mean_k(s, k):
pad = (k - s.shape[0] % k) % k
nan = np.repeat(np.nan, pad)
val = np.concatenate([s.values, nan])
return pd.Series(np.nanmean(val.reshape(-1, k), axis=1))
演示
mean_k(s, 2)
0 3.0
1 9.5
dtype: float64
mean_k(s, 3)
0 8.666667
1 -1.000000
dtype: float64
【讨论】:
你可以这样做:
(s.iloc[::2].values + s.iloc[1::2])/2
如果你愿意,你也可以在之后重置索引,所以你有 0, 1 作为索引,使用:
((s.iloc[::2].values + s.iloc[1::2])/2).reset_index(drop=True)
【讨论】: