您的位置:首页 >基于自定义迭代序号对齐合并多个 DataFrame 的完整教程
发布于2026-03-02 阅读(0)
扫一扫,手机访问

本文介绍如何根据用户指定的 iteration 字符串列表,分别从多个 DataFrame 中提取对应行并横向拼接,实现灵活、可控的跨表对齐合并,适用于性能测试数据对比等场景。
在实际数据分析(尤其是存储/数据库性能测试)中,常需将不同轮次、不同配置下的指标(如 IOPS、延迟)按特定 iteration 标识进行横向比对。但这些 iteration 值往往不完全一致,也无法直接使用 merge 或 join 的默认逻辑(如 inner/outer)。此时,按用户定义的顺序与索引显式对齐成为关键需求。
Pandas 提供了高效且可复用的解决方案:通过 set_index → reindex → reset_index 三步完成“按指定顺序拉取并保持对齐”,再结合 pd.concat(..., axis=1) 实现列方向拼接。
import pandas as pd
def align(df, lst):
return (df.set_index('iteration')
.reindex(lst) # 严格按 lst 顺序取行,缺失则为 NaN
.reset_index())
# 示例数据(已简化)
df1 = pd.DataFrame({
'iteration': ['1_1', '2_2', '3_3', '4_4', '5_5', '6_6', '7_7', '8_8', '9_9'],
'IOPS': [46090, 12, 49164, 98311, 196604, 249843, 298974, 348108, 397230],
'Latency': [0.7300, 0.0221, 0.1236, 0.1318, 0.2076, 0.1467, 0.1578, 0.1604, 0.1707]
})
df2 = pd.DataFrame({
'iteration': ['1_1', '2_2', '3_3', '4_4', '5_5', '6_6'],
'IOPS': [46074, 12, 49159, 98307, 298976, 397265],
'Latency': [0.6977, 0.0279, 0.1921, 0.2189, 0.2337, 0.2622]
})
# 按需指定每张表要提取的 iteration 序列
out = pd.concat([
align(df1, ['1_1', '2_2', '3_3', '9_9']),
align(df2, ['1_1', '2_2', '5_5', '6_6'])
], axis=1)
print(out)输出结果:
iteration IOPS Latency iteration IOPS Latency 0 1_1 46090 0.7300 1_1 46074 0.6977 1 2_2 12 0.0221 2_2 12 0.0279 2 3_3 49164 0.1236 5_5 298976 0.2337 3 9_9 397230 0.1707 6_6 397265 0.2622
? 注意:reindex 保证输出行数等于目标列表长度,且严格按列表顺序排列;若某 iteration 在原始 DataFrame 中不存在,对应位置将为 NaN(可根据需要后续用 fillna() 处理)。
当涉及 3 个及以上 DataFrame 时,推荐使用 itertools.starmap + zip 统一调度,提升代码可维护性:
from itertools import starmap
dfs = [df1, df2] # 待处理的 DataFrame 列表
iters = [
['1_1', '2_2', '3_3', '9_9'], # df1 对应的 iteration
['1_1', '2_2', '5_5', '6_6'] # df2 对应的 iteration
]
out = pd.concat(starmap(align, zip(dfs, iters)), axis=1)掌握该模式后,你不仅能精准比对任意子集的测试结果,还可轻松扩展至多工具、多环境、多参数组合的自动化分析流水线。
下一篇:比哔哩哔哩漫画更好的平台有哪些?
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9