【问题标题】:Pivoting one dataframe column with associated values to create multiple columns使用关联值旋转一个数据框列以创建多列
【发布时间】:2019-11-14 15:19:03
【问题描述】:

我有一个如下所示的数据框:

当前数据帧

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

(此处包含行之间的空格只是为了使数据框清晰且有意义,我的代码中生成的实际数据框中不需要空格。)

理想情况下,我希望作为最终结果的 Dataframe 将使用“分配类型”列来创建额外的列,从而减少行数。

期望的结果数据框

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

一个 Branch 可以运送两种不同的产品,这就解释了为什么在原始数据帧和结果数据帧中有两个不同的 A 块(具有不同的产品 ID)。

我尝试使用数据透视表,但发生的情况是,当“发货”一列有值时,其他两列的值为 NaN。所以只有一列有值,而另外两列将用 Null 填充。

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

【问题讨论】:

  • How to pivot a dataframe的可能重复
  • 如果您将输入数据格式化为有人可以直接从中创建 DataFrame 的代码,或者粘贴可以使用 pandas 轻松解释的 juputer notebook 会话的输出,您可能会得到更多响应。读剪贴板。另外,为什么两个 Dataframe 中的产品 ID 不同?
  • 试试unstackdf.set_index(list(df.columns[:-1])).Quantity.unstack('Dispense Type')

标签: python pandas dataframe pivot pivot-table


【解决方案1】:

由于这不是一个微不足道的透视,我将回答这个问题并且不会将其标记为重复。

  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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-22
    • 2016-02-01
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 2023-01-04
    相关资源
    最近更新 更多