我有一个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)
答案 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_name
和reordered
df.set_index('product_name').reordered.ge(1).sum(level=0).astype(int).reset_index()
product_name reordered
0 Cucumber Kirby 4