我有一个看起来像这样的数据框:
当前数据帧
Branch ID | Dispense Type | Product ID | Date | Quantity
-------------------------------------------------------------
A | Shipped Out | ABC3 | 5/6/19 | 10
A | Received | ABC3 | 5/6/19 | 8
A | Transferred | ABC3 | 5/6/19 | 0
A | Shipped Out | ABC3 | 5/7/19 | 5
A | Received | ABC3 | 5/7/19 | 7
A | Transferred | ABC3 | 5/7/19 | 20
B | Shipped Out | ABC3 | 5/6/19 | 40
B | Received | ABC3 | 5/6/19 | 0
B | Transferred | ABC3 | 5/6/19 | 1
B | Shipped Out | ABC3 | 5/7/19 | 6
B | Received | ABC3 | 5/7/19 | 2
B | Transferred | ABC3 | 5/7/19 | 3
A | Shipped Out | QRE3 | 5/6/19 | 7
A | Transferred | QRE3 | 5/6/19 | 10
A | Received | QRE3 | 5/6/19 | 5
(此处包含行之间的空格只是为了使数据框清晰且有意义,在我的代码中生成的实际数据框中不需要空格。)
理想情况下,作为最终结果,我想要的数据框将使用“分配类型”列添加其他列,并因此减少行数。
所需的结果数据帧
Branch ID | Date | Product ID | Shipped Out | Received | Transferred
------------------------------------------------------------------------
A | 5/6/19 | ABC3 | 10 | 8 | 0
A | 5/7/19 | ABC3 | 5 | 7 | 20
B | 5/6/19 | ABC3 | 40 | 0 | 1
B | 5/7/19 | ABC3 | 6 | 2 | 3
A | 5/6/19 | QRE3 | 7 | 10 | 5
一个分支机构可以运送两种不同的产品,这说明了为什么原始和结果数据帧中有两个不同的A块(具有不同的产品ID)。
我尝试使用数据透视表,但是发生的情况是,当“ Shipped Out”一列具有值时,其他两列将具有NaN值。因此,只有一列将具有值,而其他两列将由Null填充。
注意:我知道这类似于“如何旋转数据框”问题,但是在阅读并尝试某些方法后,我仅遇到错误,不确定哪种策略可行。
由于这不是一件容易的事,所以我将回答这个问题,而不是将其标记为重复。
pivot
您的数据和sort_index
依据level=2
(即产品ID)。columns.get_level_values
Reset index
将它们作为列返回并使用删除列轴名称 rename_axis
# Step1
piv = df.pivot_table(index=['Branch ID', 'Date', 'Product ID'], columns='Dispense Type').sort_index(level=2)
#Step2
piv.columns = piv.columns.get_level_values(1)
#Step3
piv = piv.reset_index().rename_axis(None, axis=1)
Branch ID Date Product ID Received Shipped Out Transferred
0 A 5/6/19 ABC3 8 10 0
1 A 5/7/19 ABC3 7 5 20
2 B 5/6/19 ABC3 0 40 1
3 B 5/7/19 ABC3 2 6 3
4 A 5/6/19 QRE3 5 7 10
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句