【发布时间】:2021-07-13 14:57:37
【问题描述】:
我有一个包含 10,000 行的数据框,我试图将这些行的所有可能组合相加。根据我的数学,这大约是 5000 万个组合。我将举一个小例子来简化我的数据的样子:
df = Ratio Count Score
1 6 11
2 7 12
3 8 13
4 9 14
5 10 15
这是想要的结果:
results = Min Ratio Max Ratio Total Count Total Score
1 2 13 23
1 3 21 36
1 4 30 50
1 5 40 65
2 3 15 25
2 4 24 39
2 5 34 54
3 4 17 27
3 5 27 42
4 5 19 29
这是我用来完成计算的代码:
for i in range(len(df)):
j = i + 1
while j <= len(df):
range_to_calc = df.iloc[i:j]
total_count = range_to_calc['Count'].sum()
total_score = range_to_calc['Score'].sum()
new_row = {'Min Ratio': range_to_calc.at[range_to_calc.first_valid_index(),'Ratio'],
'Max Ratio': range_to_calc.at[range_to_calc.last_valid_index(),'Ratio'],
'Total Count': total_count,
'Total Score': total_score}
results = results.append(new_row, ignore_index=True)
j = j + 1
此代码有效,但根据我的估计,运行几分钟后,需要 200 小时才能完成。我知道使用 numpy 会快很多,但我无法理解如何构建多个数组以相加。 (我认为如果我只做 1+2、2+3、3+4 等会很容易,但要困难得多,因为我需要 1+2、1+2+3、1+2+3 +4 等)是否有更有效的方法来完成此计算,以便它可以在合理的时间内运行?谢谢!
P.S.:如果您想知道我想对 5000 万行数据框做什么,我实际上并不需要在最终结果中使用它。我最终希望将结果中每一行的总分除以其总计数,以获得每个总计数的总分值,然后显示每个总计数的 1,000 个最高总分,以及每个相关的最小比率、最大值比率、总计数和总分。
【问题讨论】:
-
我不回答你的问题,但你真的需要预先计算和存储所有组合吗?你能不能在需要的时候不使用
df[2:4].sum()之类的东西? -
我刚刚编辑了我的帖子以添加 P.S.我认为可以解决您的问题。我最终想比较每一行的值,因为我不知道哪些比率将提供最高的每次计数分数,我认为我能做到这一点的唯一方法是存储所有计算的组合,(或至少存储前 1000并在计算较高的值时剔除最低值。)
-
所以你不考虑单行作为一个组合?
-
您已经创建了一个 N=10000 的 N-combinatorics 大小的问题,您绝对需要等待一周才能完成。您可以加快速度,使用 python 矢量化从您的英特尔处理器中提取每个转速,请参阅youtube.com/watch?v=EEUXKG97YRw
-
@mr7 假设你的数据框中有
k条目并且没有负分,最大的分数将是df[1:k].sum().Score,然后检查df[1:k-1].sum().Score或df[2:k].sum().Score是否是第二大的可能的总和并重复操作,直到找到最大的 1000 分。它将为您节省一周的计算时间。
标签: python pandas performance numpy combinations