两个不同长度的pandas DataFrame如何生成带自定义计算的笛卡尔积新表
问题解法
你需要实现的是两个DataFrame的笛卡尔积运算后自定义列计算,用pandas内置向量化操作即可高效完成,完全不需要嵌套循环。
方案1:Pandas 1.2.0及以上版本(最简洁)
直接用merge的cross连接模式生成笛卡尔积,再做列计算和重命名即可:
# 生成两个表全量配对的笛卡尔积 df3 = df1.merge(df2, how="cross") # 计算两值求和的新列 df3["sum"] = df3["val1"] + df3["val2"] # 重命名列、筛选需要的输出字段 df3 = df3.rename(columns={"col1": "colx", "col2": "coly"})[["colx", "coly", "sum"]]
方案2:兼容旧版本Pandas
如果使用的是更早不支持cross连接的版本,可以通过新增临时公共键的方式实现笛卡尔积:
# 给两个表新增相同值的临时关联键 df1["tmp_key"] = 0 df2["tmp_key"] = 0 # 按临时键关联得到笛卡尔积后删除临时键 df3 = df1.merge(df2, on="tmp_key").drop("tmp_key", axis=1) # 后续计算、重命名逻辑和方案1一致 df3["sum"] = df3["val1"] + df3["val2"] df3 = df3.rename(columns={"col1": "colx", "col2": "coly"})[["colx", "coly", "sum"]]
原写法的问题说明
你原来的嵌套iterrows+append写法性能非常差:iterrows遍历本身效率极低,且append每次都会生成新的DataFrame对象,数据量稍大就会出现明显卡顿,上面两种向量化方案的性能是循环写法的百倍以上,数据量越大优势越明显。
内容的提问来源于stack exchange,提问作者adamDud
相关产品推荐
相关产品推荐

