如何优化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
相关产品推荐
相关产品推荐

