如何为DataFrame每个值生成重复项,完成两个无共同列DataFrame的全量匹配
两个无共同列DataFrame的全匹配(笛卡尔积)实现方案
你需要实现的是两个DataFrame的笛卡尔积,即第一个表的每一行与第二个表的每一行两两组合,无需使用for循环实现,pandas有更高效的内置方案:
方法1:cross merge(pandas ≥ 1.2.0 版本推荐)
这是官方提供的最简单写法,直接指定合并方式为cross即可:
import pandas as pd # 原始示例数据 df_this = pd.DataFrame({'scu_key': [4, 8, 10, 12]}) df_that = pd.DataFrame({'dates': ['02-2018', '03-2018', '04-2018', '05-2018']}) # 生成笛卡尔积 df_all_that = df_this.merge(df_that, how='cross')
运行后得到的结果和你给出的预期输出完全一致。
方法2:临时辅助列merge(兼容所有pandas版本)
如果你的pandas版本低于1.2.0不支持cross merge,可以给两个表新增一个值相同的临时辅助列,按辅助列合并后删除即可:
# 新增临时共同列 df_this['tmp'] = 1 df_that['tmp'] = 1 # 合并后删除临时列 df_all_that = df_this.merge(df_that, on='tmp').drop('tmp', axis=1)
方法3:itertools.product实现(仅适合极小数据集)
数据量非常小的场景下,也可以用迭代器生成组合后转DataFrame:
from itertools import product df_all_that = pd.DataFrame(product(df_this['scu_key'], df_that['dates']), columns=['scu_key', 'dates'])
以上三种方案均为向量化实现,性能远高于手动for循环遍历拼接,适合各类数据量的场景。
内容的提问来源于stack exchange,提问作者Deke Marquardt
相关产品推荐
相关产品推荐

