You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何快速生成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

关键优化点说明

  1. 避免逐行修改DataFrame:一次性构建比逐行添加快数倍到数十倍,数据量越大,差距越明显
  2. 用numpy替代Python循环:numpy底层为C实现,向量化操作的效率远高于纯Python循环
  3. 移除冗余操作:原代码中的np.stack(permutation)属于多余操作,直接使用排列元组即可完成数据填充

内容的提问来源于stack exchange,提问作者binaryBigInt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 01:45:19