【问题标题】:vectorized way of getting pandas index values from sum condition从求和条件中获取熊猫索引值的矢量化方法
【发布时间】:2020-02-13 18:34:02
【问题描述】:

我正在使用具有 800k 记录的数据框,并希望构建一种更快的方法来获取总和条件与我当前运行 df.iterrows() 的工作版本之间的索引值。我有一列我想总结一个值,然后重置总和索引起始位置以重新开始循环。

一个简单的例子是任何超过 1000 的总和。

series = [193, 371, 163, 287, 627, 323, 382, 263, 361, 501, 282, 411, 335, 528,  396, 465, 309, 243, 348, 387, 416, 446, 464, 227, 301]

series = pd.Series(series)
target_value = 1000
start = 0
end = 0
sum_values = series[start:end+1].sum()
index_values = []
for indx, val in series.iteritems():
    if sum_values >= target_value:
        index_values.append([start, end])
        sum_values = series[end+1]
        start = end
        end += 1
    else:
        sum_values = series[start:end+1].sum()
        end += 1

index_values:
[[0, 4], [4, 7], [7, 10], [10, 13], [13, 16], [16, 20], [20, 23]]

我不知道如何使用 numpy where 函数执行此操作,一旦超过一个值就会重置。

任何方向的帮助将不胜感激。

【问题讨论】:

  • 没有向量化的方法可以直接处理这个问题,请查看numba 的迭代解决方案,应该一样快。请发布minimal reproducible example 并查看How to Ask
  • s = pd.cut(df.index, [0,26,78,85], include_lowest=True); df.groupby(s).sum()
  • stackoverflow.com/questions/56904390/… 如果得到答案,它可能会像重复一样关闭。你不可能得到比那个问题更好的答案。
  • @ALollz 我没有看到那个帖子。我会看看。谢谢
  • @ALollz 您在上面提供的链接非常有帮助。谢谢

标签: python pandas numpy vectorization


【解决方案1】:

我看到你唯一能做的就是加速这个过程,更好地猜测你的间隔大小,并进行一些多重处理。

您可以使用 np.split 进行良好的初步猜测,例如:

import numpy as np
interval_size = 10
values = np.random.rand(1000)*10
np.array(np.split(values,interval_size)).sum(axis=0)

出来:

array([4630.79410889, 5251.52550577, 4810.02960764, 5215.12946275,
       4962.31855639, 4725.5437016 , 4710.573337  , 4990.37905624,
       5324.98906685, 5105.86335981])

并迭代直到找到最佳初始值,例如:

interval = []
cost = []
for i in range(10,100,1):
    try:
        values = np.random.rand(1000)*10
        bigger = np.array(np.split(values,i)).sum(axis=0)>100
        smaller = np.array(np.split(values,i)).sum(axis=0)<200
        cost.append(sum(bigger*smaller)/len(smaller))
        interval.append(i)
    except: pass
cost
Out[73]: [0.0, 0.5, 1.0, 0.32, 0.0]

interval
Out[74]: [10, 20, 25, 40, 50]

在这种情况下,25 是区间大小的最佳初始猜测

【讨论】:

  • 就我的目的而言,准确的截止点很重要。我认为你在这里有一个有趣的概念。我最终关注了@ALollz 提供的链接,并使用 numpy 与 pandas 重建了函数,现在可接受的时间。
猜你喜欢
  • 2022-08-19
  • 2015-05-07
  • 2022-11-16
  • 1970-01-01
  • 2016-05-02
  • 2021-01-19
  • 2017-06-18
  • 2020-10-02
  • 1970-01-01
相关资源
最近更新 更多