如何根据特定已存在列的值将值放入新的独立DataFrame列?I.e转换DataFrame



我有一个DataFrame,其中包含不同来源的混合数据,请注意,在同一时间戳有一部分数据:

+--------------------------------------+------+-------------------+-----------------+---------------+-----------------------+
|devicename                            |value |time               |one_type_id|another_type_id|write_time             |
+--------------------------------------+------+-------------------+-----------------+---------------+-----------------------+
|Real_Power_KPI                        |0.0   |2021-03-24 07:06:35|NP20100000       |NP20100000     |2021-03-24 07:06:36.129|
|Voltage_Sensor                        |243.93|2021-03-24 07:06:35|NP20100000       |NP20100000     |2021-03-24 07:06:36.129|
|Current_Sensor                        |0.0   |2021-03-24 07:06:35|NP20100000       |NP20100000     |2021-03-24 07:06:36.129|
|Casing_Vibration_Sensor               |0.0   |2021-03-24 07:06:35|NP20100000       |NP20100000     |2021-03-24 07:06:36.369|
|Water_Temperature_Sensor              |17.0  |2021-03-24 07:06:35|NP20100000       |NP20100000     |2021-03-24 07:06:36.369|
|Environment_Ambient_Temperature_Sensor|17.0  |2021-03-24 07:06:35|NP20100000       |NP20100000     |2021-03-24 07:06:36.369|
|Pump_Vibration_Sensor                 |0.0   |2021-03-24 07:06:35|NP20100000       |NP20100000     |2021-03-24 07:06:36.369|
|Water_Level_Sensor                    |15.0  |2021-03-24 07:06:35|NP20100000       |NP20100000     |2021-03-24 07:06:36.369|
|Environment_Humidity_Sensor           |81.2  |2021-03-24 07:06:35|NP20100000       |NP20100000     |2021-03-24 07:06:36.369|
|Water_Temperature_Sensor              |17.0  |2021-03-24 07:06:35|NP20100000       |NP20100000     |2021-03-24 07:06:37.01 |
|Casing_Vibration_Sensor               |0.0   |2021-03-24 07:06:35|NP20100000       |NP20100000     |2021-03-24 07:06:37.01 |
|Pump_Vibration_Sensor                 |0.0   |2021-03-24 07:06:35|NP20100000       |NP20100000     |2021-03-24 07:06:37.01 |
|Environment_Ambient_Temperature_Sensor|17.0  |2021-03-24 07:06:35|NP20100000       |NP20100000     |2021-03-24 07:06:37.01 |
|Water_Level_Sensor                    |15.0  |2021-03-24 07:06:35|NP20100000       |NP20100000     |2021-03-24 07:06:37.01 |
|Environment_Humidity_Sensor           |81.2  |2021-03-24 07:06:35|NP20100000       |NP20100000     |2021-03-24 07:06:37.01 |
|Real_Power_KPI                        |0.0   |2021-03-24 07:06:35|NP20100000       |NP20100000     |2021-03-24 07:06:37.01 |
|Voltage_Sensor                        |245.01|2021-03-24 07:06:35|NP20100000       |NP20100000     |2021-03-24 07:06:37.01 |
|Current_Sensor                        |0.0   |2021-03-24 07:06:35|NP20100000       |NP20100000     |2021-03-24 07:06:37.01 |
|Real_Power_KPI                        |0.0   |2021-03-24 07:06:36|NP20100000       |NP20100000     |2021-03-24 07:06:37.01 |
|Voltage_Sensor                        |244.31|2021-03-24 07:06:36|NP20100000       |NP20100000     |2021-03-24 07:06:37.01 |
|Current_Sensor                        |0.0   |2021-03-24 07:06:36|NP20100000       |NP20100000     |2021-03-24 07:06:37.01 |

因此,我想要的是为Real_Power_KPI、Voltage_Sensor、Current_Sensor设置单独的列,并将它们的相应值连接在一行中,同时具有相同的时间戳。

类似的东西

|timestamp          |Real_Power_KPI|Voltage_Sensor|Current_Sensor|
|2021-03-24 07:06:36|0.0           |244.31        |0.0           |

那么我怎样才能以最优化的方式进行转置运算呢?

UPD。

在过过招'答案是Python代码被提出,下面是Scala:

val df = dailySensorData.filter("devicename in ('Real_Power_KPI', 'Voltage_Sensor', 'Current_Sensor')") 
.groupBy("time", "devicename").agg(expr("sum(value) as total")) 
.groupBy("time").pivot("devicename").agg(expr("first(total)"))
df.show(false)

首先进行分组和汇总,然后使用pivot将行转换为列。

df = df.filter("devicename in ('Real_Power_KPI', 'Voltage_Sensor', 'Current_Sensor')") 
.groupBy('time', 'devicename').agg(F.expr('sum(value) as total')) 
.groupBy('time').pivot('devicename').agg(F.expr('first(total)'))
df.show(truncate=False)

最新更新