如何快速生成Pandas DataFrame所有行的全排列并返回DataFrame?
高效生成DataFrame行的全排列优化方案
你的当前实现性能差主要有两个核心原因:
- 使用
iterrows()遍历行,属于Python层面的循环,效率远低于numpy向量化操作 - 用
dataframe.loc[len(dataframe)]逐行添加数据,会频繁触发DataFrame的内存扩容与复制,时间复杂度为O(n²)
下面提供两种更高效的实现方式,性能依次提升:
方法1:预先收集所有数据再构建DataFrame
先一次性收集所有排列结果和对应的module值,最后统一构建DataFrame,彻底避免逐行修改的开销:
import pandas as pd import itertools # 假设原DataFrame名为df rx_cols = ["RX1", "RX2", "RX3", "RX4"] all_perms = [] all_modules = [] # 注意:如果你的需求是所有排列都用第一行的module,把下面的row_module改成df.iloc[0]["module"] for _, row in df.iterrows(): rx_vals = row[rx_cols].tolist() row_module = row["module"] # 生成当前行的所有全排列 perms = list(itertools.permutations(rx_vals, 4)) all_perms.extend(perms) all_modules.extend([row_module] * len(perms)) # 一次性构建结果DataFrame result_df = pd.DataFrame(all_perms, columns=rx_cols) result_df["module"] = all_modules
方法2:numpy向量化操作(性能最优)
利用numpy的数组操作替代Python循环,进一步提升效率,尤其是当原DataFrame行数较多时,性能提升会非常明显:
import pandas as pd import numpy as np import itertools rx_cols = ["RX1", "RX2", "RX3", "RX4"] # 提取RX列的numpy数组和module列 rx_data = df[rx_cols].values module_data = df["module"].values # 生成4个列索引的全排列(共24种) perm_indices = np.array(list(itertools.permutations(range(4)))) n_perms = len(perm_indices) # 重复module值,每个行对应24个排列 # 如果需求是所有排列用第一行的module,替换为:repeated_modules = np.array([df.iloc[0]["module"]] * (len(df)*n_perms)) repeated_modules = np.repeat(module_data, n_perms) # 按排列索引提取元素,重塑为二维数组 rx_perms = rx_data[:, perm_indices].reshape(-1, 4) # 构建结果DataFrame result_df = pd.DataFrame(rx_perms, columns=rx_cols) result_df["module"] = repeated_modules
关键优化点说明
- 避免逐行修改DataFrame:一次性构建比逐行添加快数倍到数十倍,数据量越大,差距越明显
- 用numpy替代Python循环:numpy底层为C实现,向量化操作的效率远高于纯Python循环
- 移除冗余操作:原代码中的
np.stack(permutation)属于多余操作,直接使用排列元组即可完成数据填充
内容的提问来源于stack exchange,提问作者binaryBigInt
相关产品推荐
相关产品推荐

