python - 有没有更好/更有效的方法来做到这一点(矢量化)? Pandas apply 性能非常慢

标签 python pandas vectorization

所以在 R 中,我会为此使用优化的应用函数,但我现在读到 Panda 的应用函数是一个抽象循环,甚至可能比一个循环更慢,这在性能上有所体现。在我的机器上,处理 60k 行需要 30 分钟。

所以本质上,我希望根据具有不同组的数据集来计算移动平均值,我需要在这些数据集上计算移动平均值。有很多这样的团体。所以我基本上首先必须在行/单元格的基础上对数据集进行子集化,然后才计算移动平均值。

所以我正在尝试为此提出一个矢量化解决方案,但似乎无法弄清楚您将如何在矢量化方法中对数据框进行子集化。

我目前的解决方案使用了一个非常容易理解和维护的应用函数:

df['SMA'] = df.apply(SMA, axis=1)

def SMA(row):
     Subset = df[(df['group']==row['group'])&(df['t']<=row['t'])].reset_index()
     Subset2 = Subset[len(Subset.index)-(2):len(Subset.index)]
     return df['val'].mean()

这是我的预期输出(我目前正在获得,但速度非常非常慢):

这是数据框,这个例子我想要两个时间点的移动平均值,在这个例子中是“t”:

t   group   val moving average
1   A        1  NA
2   A        2  1.5
3   A        3  2.5
1   B        4  NA
2   B        5  4.5
3   B        6  5.5
1   C        7  NA
2   C        8  7.5
3   C        9  8.5

最佳答案

这种操作(分群)由pandas中的.groupby方法处理。如果我们注意将索引设置为时间,它还会处理为我们提供带有时间索引的正确输出。

这是一个与您的代码基本相同的示例:

df = pandas.DataFrame(
   [[1, 'A', 1], 
    [2, 'A', 2], 
    [3, 'A', 3], 
    [1, 'B', 4], 
    [2, 'B', 5], 
    [3, 'B', 6], 
    [1, 'C', 7], 
    [2, 'C', 8], 
    [3, 'C', 9]],
    columns=['t', 'group', 'val'])

df = df.set_index('t')
moving_avg = df.groupby('group').rolling(2).mean()

moving_avg 现在是一个新的数据框。请注意,因为我在第一部分中将索引设置为 t,所以它在分组和滚动平均值中得到了正确处理:

         val
group t     
A     1  NaN
      2  1.5
      3  2.5
B     1  NaN
      2  4.5
      3  5.5
C     1  NaN
      2  7.5
      3  8.5

关于python - 有没有更好/更有效的方法来做到这一点(矢量化)? Pandas apply 性能非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50773410/

相关文章:

matlab - 矢量化循环以提高效率

python - 如何知道当前哪个进程正在系统上下载某些内容?

处理导入错误的 Pythonic 方式

python - 检测列名称并根据自定义函数创建新列

python - 处理 Pandas read_csv 中的缺失数据

numpy - 我如何在 numpy 中向量化这个计算

python - 如何加速 Pandas 中的最近搜索(可能通过向量化代码)

python - 将文本数据转换为可以在Python中清理的数组?

python - 使用PyMC3的指数函数时出错

python - 将外键从一个数据帧附加到另一个数据帧的最快方法