python - 在 Pandas 中以均值转换组的更快方法

标签 python numpy pandas

我有一个 Pandas 数据框,我试图用组的平均值替换每个组中的值。在我的机器上,行 df["signal"].groupby(g).transform(np.mean) 需要大约 10 秒才能运行 N N_TRANSITIONS 设置为下面的数字。

有没有更快的方法达到相同的结果?

import pandas as pd
import numpy as np
from time import time

np.random.seed(0)

N = 120000
N_TRANSITIONS = 1400

# generate groups
transition_points = np.random.permutation(np.arange(N))[:N_TRANSITIONS]
transition_points.sort()
transitions = np.zeros((N,), dtype=np.bool)
transitions[transition_points] = True
g = transitions.cumsum()

df = pd.DataFrame({ "signal" : np.random.rand(N)})

# here is my bottleneck for large N
tic = time()
result = df["signal"].groupby(g).transform(np.mean)
toc = time()
print toc - tic

最佳答案

当前方法,使用transform

In [44]: grp = df["signal"].groupby(g)

In [45]: result2 = df["signal"].groupby(g).transform(np.mean)

In [47]: %timeit df["signal"].groupby(g).transform(np.mean)
1 loops, best of 3: 535 ms per loop

使用“广播”结果

 In [43]: result = pd.concat([ Series([r]*len(grp.groups[i])) for i, r in enumerate(grp.mean().values) ],ignore_index=True)

In [42]: %timeit pd.concat([ Series([r]*len(grp.groups[i])) for i, r in enumerate(grp.mean().values) ],ignore_index=True)
10 loops, best of 3: 119 ms per loop

In [46]: result.equals(result2)
Out[46]: True

我认为您可能需要设置广播结果返回的索引(它恰好在这里工作,因为它是默认索引<​​/p>

result = pd.concat([ Series([r]*len(grp.groups[i])) for i, r in enumerate(grp.mean().values) ],ignore_index=True)
result.index = df.index

关于python - 在 Pandas 中以均值转换组的更快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22072943/

相关文章:

python - 如何将 python 对象(如字典)分配给 pandas 列

python - 多线 Pandas 的线图

python - fillna 没有给出预期的结果

python - 将字符串复制到 Python 中的列表

python - 尝试使用 CV2 和 numpy 调整图像的大小和形状

python - 为什么 numpy View 向后?

python - Pandas 数据框仅选择全部为 True 的列

python - IndexError 使用 pandas pivot_table 方法

python - Dask - 将多个列合并为单个列

python - AWS lambda 中的 Pandas 给出了 numpy 错误