繁体   English   中英

熊猫分组依据,然后选择某些列

[英]pandas group by and then select certain columns

我有一个输入数据框

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列。 任何帮助将不胜感激!

您可以通过将re_order乘以count来预先计算re_order列,然后执行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'}))

你可以试试这个

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM