将一个数据框列与关联的值关联起来以创建多个列

时间:2019-07-03 22:08:40

标签: python pandas dataframe pivot pivot-table

我有一个看起来像这样的数据框:

当前数据帧

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填充。

注意:我了解这类似于“如何旋转数据框”问题,但是在阅读并尝试某些方法后,我只遇到了错误,不确定是否可以采用哪种策略。

1 个答案:

答案 0 :(得分:1)

由于这不是一件容易的事,所以我将回答这个问题,而不是将其标记为重复。

  1. 首先,我们pivot sort_indexlevel=2(产品ID)columns.get_level_values
  2. 我们用Reset index压平您的多索引列
  3. 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