我有这样的表格:
no Order materials status
1 1000 100 available
2 1000 200 not available
3 1001 500 Feb-20
4 1002 400 available
5 1002 300 not available
6 1002 600 available
7 1002 900 available
8 1003 700 available
9 1003 800 available
我希望有一些列显示:
- 每个订单的 Material 总数
- 每个订单的 Material 总数及其状态
我能够获取每个订单的 Material 总数:
ds.groupby('Order').count()
ds['Total Materials'] = ds.groupby('Order')['Order'].transform('count')
但不确定如何根据状态等于每个状态的条件添加新列,以便它看起来像这样:
no Order materials status Total Materials available not available Feb-20
1 1000 100 available 2 1 1 0
2 1000 200 not available 2 1 1 0
3 1001 500 Feb-20 1 0 0 1
4 1002 400 available 4 3 1 0
5 1002 300 not available 4 3 1 0
6 1002 600 available 4 3 1 0
7 1002 900 available 4 3 1 0
8 1003 700 available 2 2 0 0
9 1003 800 available 2 2 0 0
基本上是想弄清楚如何获取其余的列。感谢您的帮助!
最佳答案
我会结合使用数据透视表
和合并
:
ds_final = ds.merge(ds.pivot_table(values='Total Materials',index=['Order'],columns='status',aggfunc='count',fill_value=0).reset_index(),how='left',on='Order')
print(ds_final)
输出:
no Order materiales status Total Materials A Feb-20 not A
0 1 1000 100 A 2 1 0 1
1 2 1000 200 not A 2 1 0 1
2 3 1001 500 Feb-20 1 0 1 0
3 4 1002 400 A 4 3 0 1
4 5 1002 300 not A 4 3 0 1
5 6 1002 600 A 4 3 0 1
6 7 1002 900 A 4 3 0 1
7 8 1003 700 A 2 2 0 0
8 9 1003 800 A 2 2 0 0
一些额外的解释:
数据透视表有助于从 status
列生成列。所以这是单独的数据透视表的输出:
status Order A Feb-20 not A
0 1000 1 0 1
1 1001 0 1 0
2 1002 3 0 1
3 1003 2 0 0
最后,通过此输出,我们可以使用 merge
或 concat
来生成所需的输出。
关于Python 按其他列计算列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60299516/