pandas group by然后选择某些列

时间:2017-09-09 01:30:35

标签: python pandas dataframe group-by

我有一个输入数据框

df_orders = pd.DataFrame({'item_id': [1, 1, 2, 2, 3, 4, 4, 5, 7, 8],
                        're_order':[0, 1, 0, 1, 1, 0, 1, 1, 1, 0],
                        'count':[27, 49, 3, 1, 6, 8, 14, 1, 1, 6] }, 
                         columns=['item_id', 're_order', 'count'])
or

   item_id  re_order  count
0        1         0     27
1        1         1     49
2        2         0      3
3        2         1      1
4        3         1      6
5        4         0      8
6        4         1     14
7        5         1      1
8        7         1      1
9        8         0      6
10       8         1      7

我应该如何使用item_id对其进行分组,然后只选择re_order = 1作为一列的数据,然后选择另一列总计数?

我想要的输出

   item_id  reor_count  tot_count
0        1          49         76
1        2           1          4
2        3           6          6
3        4          14         22
4        5           1          1
5        7           1          1
6        8           7         13

我可以使用

找到总计数(tot_count)
df_orders_tot_count = df_orders.groupby('item_id')['count'].agg(['sum']).rename(columns={'sum': 'tot_count'}).reset_index()

      item_id  tot_count
0           1         76
1           2          4
2           3          6
3           4         22
4           5          1
5           7          1
6           8         13

但很难使用Pythonic方式生成reor_count列。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

您可以通过将re_orderre_order相乘来预先计算count列,然后执行groupby.sum

(df_orders.assign(re_order = df_orders['re_order'] * df_orders['count'])
 .groupby('item_id', as_index=False).sum())

# item_id   re_order    count
#0      1       49       76
#1      2       1         4
#2      3       6         6
#3      4       14       22
#4      5       1         1
#5      7       1         1
#6      8       0         6

如果您更喜欢重命名的列名称:

(df_orders.assign(re_order = df_orders['re_order'] * df_orders['count'])
 .groupby('item_id', as_index=False).sum()
 .rename(columns={'re_order': 'reor_count', 'count': 'tot_count'}))

答案 1 :(得分:0)

你可以试试这个

df.sort_values(['item_id','re_order']).groupby(['item_id'])['count'].agg({'count':'sum','re_order':'last'})
Out[244]: 
         re_order  count
item_id                 
1              49     76
2               1      4
3               6      6
4              14     22
5               1      1
7               1      1
8               6      6