我在groupby上应用了sum(),我想对最后一列的值进行排序

时间:2017-06-25 03:27:56

标签: python sorting pandas sum pandas-groupby

给出以下DataFrame

user_ID  product_id  amount
   1       456          1
   1        87          1
   1       788          3
   1       456          5
   1        87          2
  ...      ...         ...

第一列是客户的ID,第二列是他购买的产品的ID,如果在该特定日期购买的产品数量(该日期也被考虑),则表示“金额”。顾客可以按照自己的意愿每天购买许多产品。 我想计算客户购买每件产品的总次数,因此我申请了groupby

df.groupby(['user_id','product_id'], sort=True).sum()

现在我想对每组中的金额总和进行排序。 有什么帮助吗?

3 个答案:

答案 0 :(得分:3)

这将为您提供前 5 个最大的:

# n  = number of rows you want to return
df.groupby(['user_id'])['amount'].sum().nlargest(n)

答案 1 :(得分:1)

假设df是:

     user_ID  product_id  amount
0        1         456       1
1        1          87       1
2        1         788       3
3        1         456       5
4        1          87       2
5        2         456       1
6        2         788       3
7        2         456       5

然后您可以像以前一样使用,groupbysum,此外,您可以按两列[user_ID, amount]排序值,ascending=[True,False]是用户的升序和每个列的排序用户降序金额:

new_df = df.groupby(['user_ID','product_id'], sort=True).sum().reset_index()
new_df = new_df.sort_values(by = ['user_ID', 'amount'], ascending=[True,False])
print(new_df)

输出:

     user_ID   product_id  amount
1        1         456       6
0        1          87       3
2        1         788       3
3        2         456       6
4        2         788       3

答案 2 :(得分:0)

您也可以使用aggregate()

# Make up some example data
df = data.frame (user_ID = as.factor(rep(1:5, each = 5)), 
                 product_id = as.factor(sample(seq(1:10),size = 25, replace = TRUE)),
                 amount = sample(1:5, size = 25, replace = TRUE))

# Use aggregate with function sum to calculate the amount of products bought by product and customer
aggregate(amount ~  product_id * user_ID , data = df, FUN = sum)

输出:

   product_id user_ID amount
1           2       1      3
2           4       1      2
3           6       1      1
4           9       1      5
5           1       2      5
6           3       2      9
7           8       2      1
8          10       2      5
9           2       3      5
10          3       3      5
11          4       3      5
12          5       3      3
13          8       3      5
14          3       4      3
15          4       4      9
16          5       4      2
17         10       4      1
18          2       5      1
19          4       5      4
20          5       5      2
21         10       5      2