python 如何找到适合分布的最佳组合

icomxhvb  于 2023-04-28  发布在  Python
关注(0)|答案(2)|浏览(111)

我试图以某种方式对数据框架进行采样,使内容的总和适合特定的分布。
假设我想用水果装满一个篮子,但每次我只能通过添加水果的混合来实现,并且我的篮子只能容纳一定数量的每种水果。我可以在一个矩阵中表示dataframe的内容,比如:
| 混合|苹果|香蕉|橙子|
| --------------|--------------|--------------|--------------|
| 1|1|1|1|
| 二|二|二|二|
| 三|三|四|三|
我的篮子可以装3个苹果、3个香蕉和3个橙子,因此如果我选择mix 1和mix 2,就可以满足篮子的最大容量。
现在我的问题是,这个 Dataframe 包含成千上万的混合,所以以贪婪的方式搜索组合将花费很长时间。有没有一种方法来近似可能的组合?(我甚至可以计算出一点误差,i。虽然mix 3多了一个banana,但如果这有助于降低运行时间,我可以接受这个组合)。

xqnpmsa8

xqnpmsa81#

这不应该是Python运行时的问题。该脚本运行不到一秒钟就能从1000万行代码中筛选出可能的果篮

  1. import pandas as pd
  2. import numpy as np
  3. # Create a numpy array with 10.000.000 lines of random integers between 1 and 5 with shape (100000, 3)
  4. arr = np.random.randint(low=1, high=6, size=(1000000, 3))
  5. # Create a new dataframe with the random values and set the Mix column as the index
  6. df = pd.DataFrame(data=arr, columns=['apples', 'bananas', 'oranges'])
  7. df.index.name = 'Mix'
  8. display(df.head(3))
  9. # Select all lines with at most 3 apples, bananas and oranges in a descending order:
  10. display(df[(df.apples<=3) & (df.bananas<=3) & (df.oranges<=3)].sort_values(by=['apples', 'bananas', 'oranges'], ascending=False))

这是生成的输出:

  1. apples bananas oranges
  2. Mix
  3. 5 3 3 3
  4. 39 3 3 3
  5. 303 3 3 3
  6. 979 3 3 3
  7. 1019 3 3 3
  8. ... ... ... ...
  9. 998527 1 1 1
  10. 998799 1 1 1
  11. 999238 1 1 1
  12. 999280 1 1 1
  13. 999441 1 1 1
展开查看全部
ve7v8dk2

ve7v8dk22#

你可以使用dataframe过滤器,让pandas高效地完成它,而不是遍历每一行。创建一个新列,其中包含混合中所有水果的总和。然后添加过滤器到您的 Dataframe ,以剔除明显的混合不工作。一个过滤器可以是水果的总数应该〈=可以装在你的袋子里的水果总数。你也可以为每个水果添加过滤器,如果它超过了容量的话。按和排序以首先获得最佳组合

相关问题