【问题标题】:Restructuring a pandas dataframe (convert dates in rows to columns)重构 pandas 数据框(将行中的日期转换为列)
【发布时间】:2022-01-04 00:54:38
【问题描述】:

我有一个包含以下内容的 pandas 数据框

Room Position Sensor Measuring Time Value1 Value2 Value3
Living Room A1 111 27-12-2021 1.1 1.2 0.9
Living Room A2 112 27-12-2021 2.1 2.1 1.9
Living Room B1 113 27-12-2021 1.5 1.4 1.4
Living Room B2 114 27-12-2021 1.8 1.7 1.9
Bed Room A1 211 27-12-2021 4.2 4.5 4.4
Living Room A1 111 29-12-2021 0.9 1.1 0.8
Living Room A2 112 29-12-2021 1.9 1.8 1.7
Living Room B1 115 29-12-2021 1.4 1.3 1.2
Living Room B2 114 29-12-2021 1.7 1.5 1.7

我想将数据框转换如下

Room Position Sensor Value 27-12-2021 29-12-2021
Living Room A1 111 Value1 1.1 0.9
Living Room A1 111 Value2 1.2 1.1
Living Room A1 111 Value3 0.9 0.8
Living Room A2 112 Value1 2.1 1.9
Living Room A2 112 Value2 2.1 1.8
Living Room A2 112 Value3 1.9 1.7
Living Room B1 113 Value1 1.5 N/A
Living Room B1 113 Value2 1.4 N/A
Living Room B1 113 Value3 1.4 N/A
Living Room B1 115 Value1 N/A 1.4
Living Room B1 115 Value2 N/A 1.3
Living Room B1 115 Value3 N/A 1.2
Living Room B2 114 Value1 1.8 1.7
Living Room B2 114 Value2 1.7 1.5
Living Room B2 114 Value3 1.9 1.7
Bed Room A1 211 Value1 4.2 N/A
Bed Room A1 211 Value2 4.5 N/A
Bed Room A1 211 Value3 4.4 N/A

我尝试使用 pivot 但不成功。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    更新

    如果有重复,请使用 pivot_tableagg 函数:

    out = df.pivot_table(index=['Room', 'Position', 'Sensor'],
                         columns=['Measuring Time'],
                         values=['Value1', 'Value2', 'Value3'],
                         aggfunc='last') \
            .rename_axis(columns=['Value', None]).stack(level=0).reset_index()
    

    你可以使用pivot:

    out = df.pivot(index=['Room', 'Position', 'Sensor'],
                   columns=['Measuring Time'],
                   values=['Value1', 'Value2', 'Value3']) \
            .rename_axis(columns=['Value', None]).stack(level=0).reset_index()
    

    输出:

               Room Position  Sensor   Value  27-12-2021  29-12-2021
    0   Living Room       A1     111  Value1         1.1         0.9
    1   Living Room       A1     111  Value2         1.2         1.1
    2   Living Room       A1     111  Value3         0.9         0.8
    3   Living Room       A2     112  Value1         2.1         1.9
    4   Living Room       A2     112  Value2         2.1         1.8
    5   Living Room       A2     112  Value3         1.9         1.7
    6   Living Room       B1     113  Value1         1.5         NaN
    7   Living Room       B1     113  Value2         1.4         NaN
    8   Living Room       B1     113  Value3         1.4         NaN
    9   Living Room       B1     115  Value1         NaN         1.4
    10  Living Room       B1     115  Value2         NaN         1.3
    11  Living Room       B1     115  Value3         NaN         1.2
    12  Living Room       B2     114  Value1         1.8         1.7
    13  Living Room       B2     114  Value2         1.7         1.5
    14  Living Room       B2     114  Value3         1.9         1.7
    

    【讨论】:

    • 美丽答案+1。
    • 谢谢@MayankPorwal :)
    • @Corralien 感谢您的回答。它适用于我提供的样本集。但是,当我在房间中有多个条目时,例如卧室和浴室,pandas 会引发错误,指出索引包含重复条目。我该如何解决这个问题?
    • 如果你有重复的值,你必须做出决定。假设相同的日期和相同的组合,例如 `Living Room, B2, 114, Value3, you have to values like 1` 和 2。你想让我做什么?取平均值(1.5),第一个(1),最后一个(2),最小值(1),最大值(2),...
    • @Corralien 我已经用额外的房间数据更新了输入数据集。很抱歉之前提供的集合不完整。
    猜你喜欢
    • 2020-09-20
    • 2017-03-12
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 2018-03-25
    • 2018-12-15
    相关资源
    最近更新 更多