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

如何优化Pandas嵌套for循环,生成无重复的列间乘积列

解决Pandas生成无重复列对乘积的问题

方法一:使用itertools.combinations(推荐)

该方法直接生成符合要求的列对组合,无需手动处理索引,代码简洁高效:

import pandas as pd
import itertools

# 构造示例DataFrame(替换为你的实际数据)
df = pd.DataFrame({
    'AUD': [0.67],
    'USD': [1],
    'JPY': [140],
    'EUR': [1.05]
})

# 生成所有不重复的列对(无自乘、无反向重复)
column_pairs = itertools.combinations(df.columns, 2)

# 创建新DataFrame并生成乘积列
cf = pd.DataFrame()
for col1, col2 in column_pairs:
    cf[f"{col1}{col2}"] = df[col1] * df[col2]

print(cf)

输出结果:

AUDUSD  AUDJPY  AUDEUR  USDJPY  USDEUR  JPYEUR
0    0.67    93.8   0.7035     140    1.05     147

方法二:通过列索引手动控制遍历范围

如果不想额外导入itertools库,可以通过列索引实现第二个循环从当前列的下一列开始:

import pandas as pd

# 构造示例DataFrame
df = pd.DataFrame({
    'AUD': [0.67],
    'USD': [1],
    'JPY': [140],
    'EUR': [1.05]
})

cols = df.columns.tolist()
cf = pd.DataFrame()

# 外层循环遍历每一列,内层循环从当前列的下一列开始
for i in range(len(cols)):
    col1 = cols[i]
    for j in range(i + 1, len(cols)):
        col2 = cols[j]
        cf[f"{col1}{col2}"] = df[col1] * df[col2]

print(cf)

原理说明

原代码的问题在于双重循环遍历了所有列的笛卡尔积,包含自乘列(如AUDAUD)和反向重复列(如AUDUSD与USDAUD)。上述两种方法都只保留col1在col2之前的列对,且排除自乘情况,完全匹配你需要的列集合:AUDUSD、AUDJPY、AUDEUR、USDJPY、USDEUR、JPYEUR。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:45:38