【问题标题】:Merge DataFrames with the all combinations of Pks将 DataFrame 与 Pks 的所有组合合并
【发布时间】:2019-05-23 06:26:30
【问题描述】:

我正在使用两个数据帧,一个用于用户数据:

USER_ID_hash    SESSION_ID_hash PURCHASEID_hash SEX_ID
1118263 02445d553744423d4f0ea545b5d0b8e0    47de469df74e5e42a24bfd211fb658c6        m
2669790 1c7af4a49d445da0f6a4b985623e9d78    9a347a9e4ab981bb5e9643d19830ff8e        m
1535911 839938507de5eb1a81596499f22cb777    b7dd06ea7277f19c24d322b6257cd73f        f
680107  a99a661aedc1597ce13dc85f96fcb23d    fdad39b2f01378c59dc53cf5454606fe        m
895968  7c233e047f46653273aec2407e46e034    952ab03e8abaa8f9942ea0aaca79bca4        f
1963366 4349579a3398f3155363d67bb5742ca1    225977cc2924ea37d49f190e12aa8511        m
1520880 3964e87932aa3b61f2cc1a58345c2b4c    2a8964196164ca227d2ac7fe14b3f303        f
30698   7afc4e216672636f61dfbad40d9816c6    6bd8061cf66e8d98f6c41c56fd2a86ec        m
1370217 0c7eb402632ace5f62fc81eb6139e448    f8e104ef090e8504c7b57b4dce663af3        m
1171336 bad370d216ccd40302da3fb505ba2501    0cdd2301182eb1097b478dc07380c198        m

还有一个有产品细节的:

    COUPON_ID_hash  DISPEND_MONTH   DISPFROM_MONTH  VALIDFROM_MONTH VALIDEND_MONTH
70678   34a80aff2d963d28013110789cfdfdb9    11  11      
91899   f4ecdf6a1ccd5c4ae83c7a83a9f68454    1   1   1.0 2.0
37526   f0ab02ced0e91e097abc1b3c89a9d9b0    9   9   9.0 2.0
62462   e97a601bc242db11579f7eada35205fd    10  10  11.0    4.0
127695  771941be288930b649c7bb214efe2b07    3   3   3.0 9.0
136313  2faa0e168770fb01a21f3ddf1b23aeab    4   4       
156974  c340a7ab46f19c1ba3b57b513f16bead    6   6   6.0 9.0
158450  d84eb4dfc6d0b7bf0e8c50c06d14e4fe    6   6       
9992    88419bf4acc9f7e5c3529fc3bde29da6    7   7   7.0 8.0
73509   530aa1bf00c00f02255eeea81559b932    11  11

我想根据它们的 PK 组合来合并它们,它们是: USER_ID_hashCOUPON_ID_hash 并使用此功能创建一个新功能,该功能将包括这两个 PK 的所有可能情况。

例如,对于第一个User_id,我将有十行,每个Coupon_id 一个,其他9 个User_ids 相同。

有没有使这个连接有效的功能? F1,F2...FN 是输入数据帧的特征。

02445d553744423d4f0ea545b5d0b8e0-34a80aff2d963d28013110789cfdfdb9 F1  F2  FN
02445d553744423d4f0ea545b5d0b8e0-f4ecdf6a1ccd5c4ae83c7a83a9f68454 F1  F2  FN
02445d553744423d4f0ea545b5d0b8e0-f0ab02ced0e91e097abc1b3c89a9d9b0 F1  F2  FN

【问题讨论】:

  • 那么输出应该是一个包含df1和df2所有列的数据框?还是优惠券和用户哈希的组合?
  • 输出应该是一个数据框,其中包含两个输入数据框的列,并且与 PK 的组合一样多行

标签: python pandas join merge


【解决方案1】:

看起来您想要两个数据框的笛卡尔积。方法是添加一个key,它对两个数据帧中的所有值都重复,merge 使用这个key

这背后的原因是,正如documentation 中所述,当键组合在两个数据帧pd.merge 中出现多次时,笛卡尔积会:

值得花一些时间了解多对多连接案例的结果。在 SQL / 标准关系代数中,如果一个组合键在两个表中出现多次,则生成的表将具有关联数据的笛卡尔积。

请注意,在这种情况下,所有类型的合并都会产生相同的结果,这里简单地选择了left,以便按照与df1中相同的出现顺序对结果进行排序:

cp = df1.assign(key=0).merge(df2.assign(key=0), how='left', on = 'key')
cp[['USER_ID_hash','COUPON_ID_hash']]

       USER_ID_hash         COUPON_ID_hash
0        1118263  f4ecdf6a1ccd5c4ae83c7a83a9f68454
1        1118263  34a80aff2d963d28013110789cfdfdb9
2        1118263  f0ab02ced0e91e097abc1b3c89a9d9b0
3        1118263  e97a601bc242db11579f7eada35205fd
4        1118263  771941be288930b649c7bb214efe2b07
5        1118263  2faa0e168770fb01a21f3ddf1b23aeab
6        1118263  c340a7ab46f19c1ba3b57b513f16bead
7        1118263  d84eb4dfc6d0b7bf0e8c50c06d14e4fe
8        1118263  88419bf4acc9f7e5c3529fc3bde29da6
9        1118263  530aa1bf00c00f02255eeea81559b932
10       2669790  f4ecdf6a1ccd5c4ae83c7a83a9f68454
11       2669790  34a80aff2d963d28013110789cfdfdb9
12       2669790  f0ab02ced0e91e097abc1b3c89a9d9b0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-12
    • 2023-03-11
    • 2016-04-01
    • 2019-11-10
    • 2019-02-08
    • 2022-07-15
    • 2019-01-11
    • 1970-01-01
    相关资源
    最近更新 更多