与for循环相比,选择数据帧不同部分的方法更快?

时间:2019-01-05 16:06:28

标签: python pandas dataframe

我有一个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,表示客户是否以先前的订单订购了该产品。

我想获取每个产品的信息,例如,我想知道哪些产品的再订货数量最多(除其他外)。我能想到的唯一方法是遍历数据框,一次仅按产品名称选择一行,然后对每个产品的重新排序值求和。唯一的问题是大约有9万2千种不同的产品,这使我的电脑瘫痪,并且永远无法解决。这是我的代码。我将结果保存到字典中,但可以使用其他方法。必须有一种更有效的方法来做到这一点?

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)

2 个答案:

答案 0 :(得分:0)

尝试使用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')

答案 1 :(得分:0)

请尝试以下操作,但是我不确定这就是您要寻找的内容:

您图解的数据框结构:

   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_namereordered

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