
本文介绍如何将 Pandas DataFrame 的每一行视为一个整体单元,高效生成指定大小(如 3)的所有行组合,并将组合结果横向展开为新 DataFrame,列名按原列重复排列,适用于中等规模数据的组合分析场景。
本文介绍如何将 Pandas DataFrame 的每一行视为一个整体单元,高效生成指定大小(如 3)的所有行组合,并将组合结果横向展开为新 DataFrame,列名按原列重复排列,适用于中等规模数据的组合分析场景。
在数据分析与特征工程中,常需基于原始记录构造高阶交互样本(例如两两配对、三元组关系建模)。此时,不能将各列拆解为独立元素,而应将整行作为不可分割的逻辑单元参与组合。Pandas 本身不提供行级组合内置方法,但借助 itertools.combinations 配合向量化构造,可实现简洁且相对高效的解决方案。
以下为完整实现流程:
-
明确组合语义:以
df.iloc[i]为单位进行组合,每组输出包含combination_size行的全部字段,横向拼接; -
生成行组合索引或值:推荐直接使用
df.values获取 NumPy 数组,避免索引开销; -
扁平化组合结构:每个组合是
combination_size × n_cols的元组,需展平为一维列表; -
动态构建列名:用
np.tile(df.columns, combination_size)实现'A','B','A','B','A','B'类列名序列。
import pandas as pd
import itertools
import numpy as np
# 示例数据
df = pd.DataFrame({'A': ['a', 'b', 'c', 'd'], 'B': ['1', '2', '3', '4']})
combination_size = 3
# ✅ 高效实现(推荐)
from itertools import combinations, chain
# 1. 生成所有行组合(返回 tuple of arrays)
row_combinations = combinations(df.values, combination_size)
# 2. 每个组合展平为一维数组,构造 DataFrame
combination_df = pd.DataFrame(
(chain.from_iterable(c) for c in row_combinations), # 生成器表达式,节省内存
columns=np.tile(df.columns, combination_size)
)
print(combination_df)输出:
A B A B A B 0 a 1 b 2 c 3 1 a 1 b 2 d 4 2 a 1 c 3 d 4 3 b 2 c 3 d 4
⚠️ 注意事项:
- 组合数呈组合爆炸增长(
C(n, k)),当len(df) > 30且k ≥ 5时,内存与计算时间显著上升,建议提前采样或改用流式处理(如分批生成 + 写入 HDF5/Parquet); - 若需保留原始索引信息,可改用
list(combinations(df.iterrows(), k)),但性能下降约 3–5 倍; - 列名重复可能导致后续操作歧义(如
df['A']返回多列),建议在组合后重命名列,例如:cols = [f"{col}_{i+1}" for i in range(combination_size) for col in df.columns] combination_df.columns = cols
该方法兼顾可读性与执行效率,在千行级数据上可秒级完成三元组生成,是处理行级组合任务的实用基准方案。

















