我有一个输入数据框
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'}))
关于python - pandas 分组然后选择某些列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46126362/