通过其他数据框的列过滤的熊猫笛卡尔积

时间:2018-10-28 01:02:30

标签: python pandas numpy pandas-groupby

我有一个csv文件,其中包含img_A,img_B和目标值列。

csv 1:

     img_A        img_B   target
    img1.png    img2.png    1
    img1.png    img3.png    1
    img1.png    img4.png    0
    img1.png    img5.png    1
    img6.png    img1.png    0

我还有另一个巨大的csv文件,其中包含所有图像及其特征向量,例如:

csv2:

       img     f1  f2  f3  f4  f5
    img1.png    0   1   0   1   0

我需要具有一个合并的特征向量,例如:

     img_A   img_B   f1_A  f2_A  f3_A  f4_A f5_A f1_B f2_B f3_B f4_B f5_B target
   img1.png img_2.png 0    1      0     1     0    0    1    0   1     0   1

虽然我的第一印象是通过将csv2与自身合并来获得笛卡尔乘积,然后使用csv1中的列组合对其进行过滤,但由于csv2的形状约为20000 x 512并且csv1的形状约为 75000 x 3。

我尝试过:

df = df.assign(key=1).merge(df.assign(key=1), on="key", suffixes=["_A", "_B"]).drop("key", axis=1) # memory error

尽管我尝试将数据划分为多个块,但要花很长时间才能获得结果。

有人可以建议这样做的最佳方法吗?

1 个答案:

答案 0 :(得分:2)

给定df1的数据帧df2,您可以在重命名df2中的列之后合并两次:

res = df1.merge(df2.add_suffix('_A'), on='img_A')\
         .merge(df2.add_suffix('_B'), on='img_B')