我有一个看起来像这样的数据框:
当前数据帧
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填充。
注意:我了解这类似于“如何旋转数据框”问题,但是在阅读并尝试某些方法后,我只遇到了错误,不确定是否可以采用哪种策略。
答案 0 :(得分:1)
由于这不是一件容易的事,所以我将回答这个问题,而不是将其标记为重复。
pivot
sort_index
和level=2
(产品ID)columns.get_level_values
。Reset index
压平您的多索引列rename_axis
将其重新获取为列,并使用here删除列轴名称# 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