对熊猫系列的 k 个元素组应用函数
Posted
技术标签:
【中文标题】对熊猫系列的 k 个元素组应用函数【英文标题】:apply function on groups of k elements of a pandas Series 【发布时间】:2017-02-07 08:58:51 【问题描述】:我有一个熊猫系列:
0 1
1 5
2 20
3 -1
假设我想在每两个元素上应用mean()
,所以我得到这样的结果:
0 3.0
1 9.5
有没有优雅的方法来做到这一点?
【问题讨论】:
我已经更新了我的帖子。 【参考方案1】:你可以用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
【讨论】:
谢谢!有什么办法可以处理k不除数列长度的情况吗?我试过:(s[-m:].index // k)当k除m,但是没用 我想我明白了。但是你需要先reset_index
- s = s[-m:].reset_index(drop=True)
然后使用print (s.groupby([s.index // k]).mean())
知道了,所以我想需要这样做 [(s.index + ((k - (len(s) % k)) % k)) // k]【参考方案2】:
如果您在大型系列中多次使用此方法,则需要考虑一种快速方法。此解决方案使用所有 numpy 函数,速度很快。
使用reshape
并构造新的pd.Series
考虑pd.Series
s
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
【讨论】:
【参考方案3】:你可以这样做:
(s.iloc[::2].values + s.iloc[1::2])/2
如果你愿意,你也可以在之后重置索引,所以你有 0, 1 作为索引,使用:
((s.iloc[::2].values + s.iloc[1::2])/2).reset_index(drop=True)
【讨论】:
我的错,有点太快了;) 这适用于 k=2 的情况,但我想对许多 k 这样做... 嗯嗯应该还是可以的,我会考虑一下:)。以上是关于对熊猫系列的 k 个元素组应用函数的主要内容,如果未能解决你的问题,请参考以下文章