如何使用Pandas将同时间传感器的行内多值数据转换为列格式并展开?
解决方案
可以通过pandas的数据重塑操作实现需求,核心是先将宽表转为长表,再重新透视成目标格式:
步骤说明
- 拆分多值列:将每个sensor对应的
value1至value6列拆分为多行,每行对应一个value项 - 构建分组索引:提取value列的序号(1-6),作为同一time下的分组依据
- 透视转换:将
sensor列转为列名(ACCX/ACCY/ACCZ),按time和序号分组聚合 - 整理结果:重置索引,得到目标格式
代码实现
import pandas as pd # 示例数据(可替换为实际数据读取代码,如pd.read_csv) data = [ [22.10, 'ACCX', 6, 0.23, 0.44, 0.53, 0.23, 0.44, 0.53], [22.10, 'ACCY', 6, 0.87, 0.32, 0.12, 0.87, 0.32, 0.12], [22.10, 'ACCZ', 6, 0.44, 0.33, 0.45, 0.63, 0.44, 0.93], [22.12, 'ACCX', 6, 0.63, 0.44, 0.93, 0.87, 0.32, 0.12], [22.12, 'ACCY', 6, 0.87, 0.32, 0.12, 0.44, 0.33, 0.45], [22.12, 'ACCZ', 6, 0.44, 0.33, 0.45, 0.34, 0.22, 0.78], [22.15, 'ACCX', 6, 0.23, 0.44, 0.53, 0.64, 0.53, 0.25], [22.15, 'ACCY', 6, 0.87, 0.32, 0.12, 0.87, 0.32, 0.12], [22.15, 'ACCZ', 6, 0.44, 0.33, 0.45, 0.44, 0.33, 0.45], [22.18, 'ACCX', 6, 0.63, 0.44, 0.93, 0.87, 0.32, 0.12], [22.18, 'ACCY', 6, 0.87, 0.32, 0.12, 0.44, 0.33, 0.45], [22.18, 'ACCZ', 6, 0.44, 0.33, 0.45, 0.87, 0.32, 0.12], ] columns = ['time', 'sensor', 'sample', 'value1', 'value2', 'value3', 'value4', 'value5', 'value6'] df = pd.DataFrame(data, columns=columns) # 将value列转为长表 melted = df.melt(id_vars=['time', 'sensor'], value_vars=[f'value{i}' for i in range(1,7)], var_name='value_idx', value_name='value') # 提取value的序号作为分组键 melted['idx'] = melted['value_idx'].str.extract('(\d+)').astype(int) # 透视转换,将sensor转为列 pivoted = melted.pivot_table(index=['time', 'idx'], columns='sensor', values='value', aggfunc='first').reset_index() # 整理最终列顺序 result = pivoted[['time', 'ACCX', 'ACCY', 'ACCZ']] # 输出或保存结果 print(result)
结果验证
运行代码后,输出结果将与目标格式完全匹配:每个time对应6行,每行包含该时间点下ACCX/ACCY/ACCZ对应位置的value值。
内容的提问来源于stack exchange,提问作者Halahhemy
相关产品推荐
相关产品推荐

