Pandas遍历DataFrame行对时如何实现首尾行配对拼接输出
实现方案
核心思路:将DataFrame首行追加到原表末尾,构造首尾相连的环形行序列,再逐次取相邻两行做扁平化拼接,无需单独编写最后一组首尾配对的逻辑,即可输出全部符合要求的结果。
方法1:pandas原生实现(可读性强,无额外依赖)
import pandas as pd # 示例DataFrame df = pd.DataFrame({ 'x': [1.0, 2.0, 2.0, 1.5], 'y': [1.1, 1.0, 2.0, 3.0] }) # 追加首行到表尾,构造环形行结构 df_ring = pd.concat([df, df.iloc[[0]]], ignore_index=True) result = [] for i in range(len(df)): # 取连续两行展平为列表 pair = df_ring.iloc[i:i+2].to_numpy().flatten().tolist() result.append(pair) # 输出验证 for item in result: print(item)
运行输出完全匹配预期:
[1.0, 1.1, 2.0, 1.0] [2.0, 1.0, 2.0, 2.0] [2.0, 2.0, 1.5, 3.0] [1.5, 3.0, 1.0, 1.1]
方法2:numpy向量化实现(适合大体积DataFrame,性能更高)
逐行循环在数据量超过10万行时效率较低,可直接用numpy滑动窗口API批量生成结果,无显式循环:
import numpy as np # 构造环形数组 arr_ring = np.vstack([df.to_numpy(), df.iloc[0].to_numpy()]) # 滑动窗口取连续2行,展平得到全部配对结果 result = np.lib.stride_tricks.sliding_window_view( arr_ring, window_shape=(2, df.shape[1]) ).reshape(-1, df.shape[1]*2).tolist()
注意事项
- 做数组转换优先用
to_numpy(),相比直接取values属性可以灵活控制输出dtype,避免隐式类型转换丢失数值精度 - 取行时始终用
iloc按行位置索引,即使原DataFrame索引不连续也不会出现行配对错位问题 - 如果不需要保留DataFrame结构,直接将df转numpy数组后做环形拼接和滑动窗口处理,速度会比操作pandas对象更快
内容的提问来源于stack exchange,提问作者Fernando Gutiérrez
相关产品推荐
相关产品推荐

