【问题标题】:Faster way to select different sections of dataframe than a for loop?选择数据帧不同部分的方法比 for 循环更快?
【发布时间】:2019-05-31 21:34:27
【问题描述】:

我有一个 instacart 订单数据框

order_id    product_id  add_to_cart_order   reordered   product_name    
32          49683       7                   1           Cucumber Kirby  
52          49683       4                   1           Cucumber Kirby  
88          49683       20                  0           Cucumber Kirby  
95          49683       12                  1           Cucumber Kirby  
111         49683       5                   1           Cucumber Kirby  

reordered 是 1 或 0,表示客户是否在之前的订单中订购了该产品。

我想获取每个产品的信息,例如,我想知道哪些产品的重新订购次数最多(除其他外)。我能想到的唯一方法是遍历数据框,一次只选择一个按产品名称的行,并对每个产品的 reordered 值求和。唯一的问题是大约有 92k 种不同的产品,这会破坏我的计算机并永远占用。这是我的代码。我将结果保存到字典中,但我对其他方法持开放态度。一定有更有效的方法来做到这一点?

reordersums = {}
for product in list(products.product_name):
# Select the rows whose product name matches the product we are checking, sum the values in column "reordered"
    reordersum = order_products[order_products.product_name == product].reordered.sum()

    reordersums[product]=reordersum    
print(reordersums)

【问题讨论】:

  • df[df.reordered==1].groupby('product_name').sum() 这应该可以。试试 Sam,如果没有,您能否分享示例数据以进行一些分析。
  • @Sam,如果您正在寻找答案,请查看答案,或者您可以使用所需的结果更新您的帖子。
  • @AmitAmola 啊,是的,groupby,我怎么会忘记。你的一行代码很简单,很优雅,给了我我需要的东西。谢谢
  • 我可以将其添加为答案,您可以投票吗?哈哈@山姆
  • @SamRheault,但如果您的 reordered 计数超过 1,请确保这将不起作用所以最好使用带有 lambda 的过滤器,以防值变为 1 (==1)2 或任何更高。

标签: python pandas dataframe


【解决方案1】:

尝试使用group_by接口:

# Group up the dataframe by product
group_products = products.groupby('product_name')

# Sum the groups on the reordered column
reordered_sums = group_products['reordered'].agg('sum')

【讨论】:

    【解决方案2】:

    请在下面尝试,但是我不确定这是否是您要查找的内容:

    您图解的 DataFrame 结构:

       order_id  product_id  add_to_cart_order  reordered    product_name
    0        32       49683                  7          1  Cucumber Kirby
    1        52       49683                  4          1  Cucumber Kirby
    2        88       49683                 20          0  Cucumber Kirby
    3        95       49683                 12          1  Cucumber Kirby
    4       111       49683                  5          1  Cucumber Kirby
    

    解决方案: groupby + DataFrame.filter + sum()

    >>> df.groupby('reordered').filter(lambda x: len(x) > 1).groupby(['product_name']).sum().reset_index()
         product_name  order_id  product_id  add_to_cart_order  reordered
    0  Cucumber Kirby       290      198732                 28          4
    

    OR ,正如@Amit 在评论部分所建议的那样。

    >>> df[df.reordered==1].groupby('product_name').sum().reset_index()
         product_name  order_id  product_id  add_to_cart_order  reordered
    0  Cucumber Kirby       290      198732                 28          4
    

    OR,如果您只想查看product_name & reordered

    df.set_index('product_name').reordered.ge(1).sum(level=0).astype(int).reset_index()
         product_name  reordered
    0  Cucumber Kirby          4
    

    【讨论】:

      猜你喜欢
      • 2022-07-06
      • 2013-10-14
      • 2017-08-31
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2021-10-18
      • 2021-07-08
      • 2016-06-07
      相关资源
      最近更新 更多