如何用Pandas将多个DataFrame合并为列MultiIndex结构?
解决方案步骤
处理单个文件数据,生成列MultiIndex的子表
无需拆分单个统计指标表,直接通过melt和pivot一步生成目标结构:# 读取单个文件数据(readRawData需返回含Tag/Min/Max/Avg/Stdev的DataFrame) temp = readRawData(wd, f, dataset) # 过滤Tag为'0'的无效行 temp = temp[temp['Tag'] != '0'].copy() # 将宽格式转为长格式:提取传感器标签、统计指标、对应数值 temp_long = temp.melt(id_vars='Tag', var_name='Metric', value_name='Value') # 转成列MultiIndex的宽表:列层级为(传感器标签, 统计指标) temp_multi = temp_long.pivot(columns=['Tag', 'Metric'], values='Value')此时
temp_multi的结构即为单测试点的目标格式:Tag1 Tag2 Min Max Avg Stdev Min Max Avg Stdev 0 min1 max1 avg1 std1 min2 max2 avg2 std2循环合并所有文件数据
初始化空DataFrame,循环处理每个文件并合并:final_data = pd.DataFrame() # 假设files是待处理的文件列表 for f in files: temp = readRawData(wd, f, dataset) temp = temp[temp['Tag'] != '0'].copy() temp_long = temp.melt(id_vars='Tag', var_name='Metric', value_name='Value') temp_multi = temp_long.pivot(columns=['Tag', 'Metric'], values='Value') # 合并到最终数据集 final_data = pd.concat([final_data, temp_multi], ignore_index=True)可选:优化MultiIndex配置
可给列层级命名或调整顺序,方便后续操作:# 给列层级命名 final_data.columns.names = ['Sensor', 'Statistic'] # 交换层级顺序(如将统计指标放在第一层) final_data = final_data.swaplevel(axis='columns')
方案优势
- 避免拆分多份单指标DataFrame的冗余操作,代码更简洁
- 生成的标准MultiIndex结构可直接用于筛选分析,无需处理字符串后缀:
# 筛选所有传感器的平均值数据 avg_data = final_data.xs('Avg', level='Statistic', axis='columns') # 筛选单个传感器Tag1的全量统计数据 tag1_data = final_data.xs('Tag1', level='Sensor', axis='columns')
替代转置方案
若偏好转置操作,可采用以下方式生成目标结构:
temp = readRawData(wd, f, dataset) temp = temp[temp['Tag'] != '0'].copy() # 设置Tag为索引后转置,行变为统计指标、列变为传感器标签 temp_transposed = temp.set_index('Tag').T # 重置索引并构建MultiIndex列 temp_transposed = temp_transposed.reset_index().rename(columns={'index': 'Metric'}) temp_multi = temp_transposed.set_index('Metric').unstack().to_frame().T # 调整列层级顺序为(传感器标签, 统计指标) temp_multi = temp_multi.swaplevel(axis='columns').sort_index(axis='columns')
内容的提问来源于stack exchange,提问作者Mike H
相关产品推荐
相关产品推荐

