简体   繁体   English

重构 pandas dataframe(将行中的日期转换为列)

[英]Restructuring a pandas dataframe (convert dates in rows to columns)

I have a pandas dataframe with the following contents我有一个 pandas dataframe,内容如下

Room房间 Position Position Sensor传感器 Measuring Time测量时间 Value1价值1 Value2价值2 Value3价值3
Living Room客厅 A1 A1 111 111 27-12-2021 27-12-2021 1.1 1.1 1.2 1.2 0.9 0.9
Living Room客厅 A2 A2 112 112 27-12-2021 27-12-2021 2.1 2.1 2.1 2.1 1.9 1.9
Living Room客厅 B1 B1 113 113 27-12-2021 27-12-2021 1.5 1.5 1.4 1.4 1.4 1.4
Living Room客厅 B2 B2 114 114 27-12-2021 27-12-2021 1.8 1.8 1.7 1.7 1.9 1.9
Bed Room卧室 A1 A1 211 211 27-12-2021 27-12-2021 4.2 4.2 4.5 4.5 4.4 4.4
Living Room客厅 A1 A1 111 111 29-12-2021 29-12-2021 0.9 0.9 1.1 1.1 0.8 0.8
Living Room客厅 A2 A2 112 112 29-12-2021 29-12-2021 1.9 1.9 1.8 1.8 1.7 1.7
Living Room客厅 B1 B1 115 115 29-12-2021 29-12-2021 1.4 1.4 1.3 1.3 1.2 1.2
Living Room客厅 B2 B2 114 114 29-12-2021 29-12-2021 1.7 1.7 1.5 1.5 1.7 1.7

I want to convert the dataframe as below我想转换 dataframe 如下

Room房间 Position Position Sensor传感器 Value价值 27-12-2021 27-12-2021 29-12-2021 29-12-2021
Living Room客厅 A1 A1 111 111 Value1价值1 1.1 1.1 0.9 0.9
Living Room客厅 A1 A1 111 111 Value2价值2 1.2 1.2 1.1 1.1
Living Room客厅 A1 A1 111 111 Value3价值3 0.9 0.9 0.8 0.8
Living Room客厅 A2 A2 112 112 Value1价值1 2.1 2.1 1.9 1.9
Living Room客厅 A2 A2 112 112 Value2价值2 2.1 2.1 1.8 1.8
Living Room客厅 A2 A2 112 112 Value3价值3 1.9 1.9 1.7 1.7
Living Room客厅 B1 B1 113 113 Value1价值1 1.5 1.5 N/A不适用
Living Room客厅 B1 B1 113 113 Value2价值2 1.4 1.4 N/A不适用
Living Room客厅 B1 B1 113 113 Value3价值3 1.4 1.4 N/A不适用
Living Room客厅 B1 B1 115 115 Value1价值1 N/A不适用 1.4 1.4
Living Room客厅 B1 B1 115 115 Value2价值2 N/A不适用 1.3 1.3
Living Room客厅 B1 B1 115 115 Value3价值3 N/A不适用 1.2 1.2
Living Room客厅 B2 B2 114 114 Value1价值1 1.8 1.8 1.7 1.7
Living Room客厅 B2 B2 114 114 Value2价值2 1.7 1.7 1.5 1.5
Living Room客厅 B2 B2 114 114 Value3价值3 1.9 1.9 1.7 1.7
Bed Room卧室 A1 A1 211 211 Value1价值1 4.2 4.2 N/A不适用
Bed Room卧室 A1 A1 211 211 Value2价值2 4.5 4.5 N/A不适用
Bed Room卧室 A1 A1 211 211 Value3价值3 4.4 4.4 N/A不适用

I tried using pivot but was unsuccessful.我尝试使用 pivot 但不成功。

You can use pivot :您可以使用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()

Output: Output:

           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

Another way with using melt and pivot :使用meltpivot的另一种方法:

df.melt(
        id_vars=['Room', 'Position', 'Sensor', 'Measuring Time'])\
    .pivot(index=['Room', 'Position', 'Sensor','variable'],columns=['Measuring Time'], values='value').reset_index()

Measuring Time         Room Position  Sensor variable  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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM