我有一个输入数据框
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列。任何帮助将不胜感激!
答案 0 :(得分:2)
您可以通过将re_order
与re_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