如何将同ID多行加速度计数据转换为宽格式DataFrame用于机器学习
加速度计数据长格式转宽格式解决方案
我正在将加速度计数据样本合并为单个DataFrame用于机器学习,每个样本含100条数据存于CSV,合并后得到长格式DataFrame:
| ID | X | Y | Z | Class |
|---|---|---|---|---|
| ID 1 | 4 | 2 | 6 | 动作1 |
| ID 1 | 4 | 2 | 5 | 动作1 |
| ID 2 | 3 | 4 | 4 | 动作2 |
| ID 2 | 2 | 2 | 1 | 动作2 |
| ID 3 | 1 | 4 | 5 | 动作3 |
| ID 3 | 2 | 3 | 2 | 动作3 |
| ID 4 | 2 | 1 | 5 | 动作1 |
| ID 4 | 2 | 2 | 5 | 动作1 |
需要转换为宽格式DataFrame适配机器学习:
| ID | X1 | Y1 | Z1 | X2 | Y2 | Z2 | Class |
|---|---|---|---|---|---|---|---|
| ID 1 | 4 | 2 | 6 | 4 | 2 | 5 | 动作1 |
| ID 2 | 3 | 4 | 4 | 2 | 2 | 1 | 动作2 |
| ID 3 | 1 | 4 | 5 | 2 | 3 | 2 | 动作3 |
| ID 4 | 2 | 1 | 5 | 2 | 2 | 5 | 动作1 |
已尝试melt、stack/unstack、groupby及for循环,未得到理想结果,求可行方案。
解决方案
核心思路是先给每个ID下的行添加组内序号,再通过pivot实现宽表转换,适配100条数据的样本完全没问题:
步骤1:添加组内序号
对每个ID分组,为组内每行生成从1开始的序号,用来区分同一ID下的不同采样点:
import pandas as pd # 假设原始长格式数据存储在df中 df['sample_num'] = df.groupby('ID').cumcount() + 1
步骤2:转换为宽格式
用pivot方法,以ID和Class作为索引,sample_num关联列名,X/Y/Z作为值:
wide_df = df.pivot(index=['ID', 'Class'], columns='sample_num', values=['X', 'Y', 'Z'])
步骤3:整理列名并重置索引
把多层列名合并为X1、Y1这种格式,再将ID和Class从索引转回普通列:
# 合并多层列名 wide_df.columns = [f'{col[0]}{col[1]}' for col in wide_df.columns] # 重置索引 wide_df = wide_df.reset_index()
完整可运行代码
import pandas as pd # 构造示例数据(实际使用时替换为你的CSV加载代码) data = { 'ID': ['ID 1', 'ID 1', 'ID 2', 'ID 2', 'ID 3', 'ID 3', 'ID 4', 'ID 4'], 'X': [4,4,3,2,1,2,2,2], 'Y': [2,2,4,2,4,3,1,2], 'Z': [6,5,4,1,5,2,5,5], 'Class': ['动作1','动作1','动作2','动作2','动作3','动作3','动作1','动作1'] } df = pd.DataFrame(data) # 添加组内序号 df['sample_num'] = df.groupby('ID').cumcount() + 1 # 转换为宽格式 wide_df = df.pivot(index=['ID', 'Class'], columns='sample_num', values=['X', 'Y', 'Z']) # 整理列名与索引 wide_df.columns = [f'{col[0]}{col[1]}' for col in wide_df.columns] wide_df = wide_df.reset_index() print(wide_df)
运行后输出的结果就是目标宽格式DataFrame,针对每个ID下100条数据的场景,会自动生成X1至X100、Y1至Y100、Z1至Z100的列。
内容的提问来源于stack exchange,提问作者Grimsbear
相关产品推荐
相关产品推荐

