使用关联值旋转一个数据框列以创建多个列

尼克·图尔

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

当前数据帧

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. 首先,我们根据pivot您的数据和sort_index依据level=2(即产品ID)。
  2. 我们用 columns.get_level_values
  3. 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

通过按列值分组从一个熊猫数据框创建多个数据框

使用一个数据框列中的键和另一个数据框列中的值创建字典

根据另一个数据集中的列值在一个数据框中创建列

根据另一个数据框的列值创建一个数据框

使用R中另一个数据框的值在数据框中创建列

使用pd.merge映射一个数据框中来自另一个数据框的多个列的值

根据来自另一个数据框的多个列条件创建列

根据另一个数据框列的唯一值创建一个新的数据框

检查多个列的多个值并返回一个数据框

R:使用另一个数据框创建一个新列

如何基于另一个数据框中的列值创建布尔列

从多个列表创建一个数据框,其中列表的每个项目都转到列

用新的列值作为列表的名称创建一个数据框

根据与另一个数据框中的值匹配的行数创建新列

Python Pandas:根据另一个数据框的类别值创建新列

如何使用条件匹配一个数据框的列的值与另一个数据框的列的值?

根据来自另一个数据框的查找值创建一个熊猫列

将数据框中的多个列与另一个数据框中的特定值相乘

使用另一个数据框中的指定值填充一列

使用 for 循环将多个数据框列合并为一个

在一个数据框列中使用多个时区

根据另一个数据框替换一个数据框中的列中的多个值

遍历一个数据框中的单个列与另一个数据框中的列进行比较使用熊猫在第一个数据框中创建新列

通过将列值乘以另一个数据框来创建多索引数据框

创建一个数据框列,其中包含来自另一个数据框的匹配值列表

如何使用另一个数据框添加数据框并基于列添加公共列值?

数据框,使用基于另一列索引的值创建一个新列

解析数据框中的重载列 - 使用一个 mutate 语句创建多个列

将多个数据框列连接到一个数据框列下的单个数组中