对熊猫系列的 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.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

【讨论】:

【参考方案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 个元素组应用函数的主要内容,如果未能解决你的问题,请参考以下文章

从两个熊猫系列(csv的列作为DataFrame)创建元素字典

Bloom Filter

迭代熊猫系列元素的最佳方法

【比较难写的算法】最坏情况线性时间的选择

如何获得熊猫系列的元素逻辑非?

如何获得熊猫系列的元素逻辑非?