如何用Pandas将多设备时间序列数据按列转成行?
用Pandas实现多设备读数数据的宽表转长表(扁平化)
问题描述
我从系统获取了一段时间范围内的多设备读数数据,日期时间为单独一列,每个设备的读数各占一列,示例DataFrame如下:
Date/Time DEVICE_1 DEVICE_2 01/01 01:00:00 10.141667 8.807851
希望将其转换为扁平化格式:每个设备列转为一行,包含相同的时间戳、设备名称和对应数值,示例输出如下:
Date/Time Name Value 01/01 01:00:00 DEVICE_1 10.141667 01/01 01:00:00 DEVICE_2 8.807851
若有10个设备,每个时间戳对应的行需拆分为10行,每行对应一个设备,要求用Pandas实现且避免循环操作。
解决方案
完全可以用Pandas内置的melt()函数实现,这是专门用于宽表转长表的高效工具,无需手动循环,处理大量设备数据时性能优势明显。
代码示例
假设你的原始DataFrame名为df,执行以下代码即可完成转换:
import pandas as pd # 构造示例数据(实际使用时替换为你的原始数据) data = { 'Date/Time': ['01/01 01:00:00'], 'DEVICE_1': [10.141667], 'DEVICE_2': [8.807851] } df = pd.DataFrame(data) # 执行宽转长操作 flattened_df = df.melt( id_vars=['Date/Time'], # 保留作为标识的时间戳列 var_name='Name', # 转换后设备名称列的表头 value_name='Value' # 转换后读数数值列的表头 ) print(flattened_df)
输出结果
Date/Time Name Value 0 01/01 01:00:00 DEVICE_1 10.141667 1 01/01 01:00:00 DEVICE_2 8.807851
参数说明
id_vars:指定不需要被转换的列(这里是时间戳列),每行的该列值会自动重复对应到每个设备的行中。var_name:设置原设备列名转换后的新列名,对应示例中的Name。value_name:设置原设备读数转换后的新列名,对应示例中的Value。
无论你有10个还是更多设备,这个方法都能一次性完成转换,完全不需要循环操作。
内容的提问来源于stack exchange,提问作者berimbolo
相关产品推荐
相关产品推荐

