为了账号安全,请及时绑定邮箱和手机立即绑定

带有 Pandas 的高性能笛卡尔积(CROSS JOIN)

带有 Pandas 的高性能笛卡尔积(CROSS JOIN)

神不在的星期二 2021-09-11 20:00:19
这篇文章的内容最初是作为Pandas Merging 101的一部分 ,但由于完全公正地处理该主题所需的内容的性质和大小,它已移至其自己的 QnA。给定两个简单的 DataFrame;left = pd.DataFrame({'col1' : ['A', 'B', 'C'], 'col2' : [1, 2, 3]})right = pd.DataFrame({'col1' : ['X', 'Y', 'Z'], 'col2' : [20, 30, 50]})left  col1  col20    A     11    B     22    C     3right  col1  col20    X    201    Y    302    Z    50可以计算这些帧的叉积,如下所示:A       1      X      20A       1      Y      30A       1      Z      50B       2      X      20B       2      Y      30B       2      Z      50C       3      X      20C       3      Y      30C       3      Z      50计算此结果的最高效方法是什么?
查看完整描述

3 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

在熊猫 1.2.0 之后merge现在有选项cross


left.merge(right, how='cross')

使用itertools product和重新创建数据帧中的值


import itertools

l=list(itertools.product(left.values.tolist(),right.values.tolist()))

pd.DataFrame(list(map(lambda x : sum(x,[]),l)))

   0  1  2   3

0  A  1  X  20

1  A  1  Y  30

2  A  1  Z  50

3  B  2  X  20

4  B  2  Y  30

5  B  2  Z  50

6  C  3  X  20

7  C  3  Y  30

8  C  3  Z  50


查看完整回答
反对 回复 2021-09-11
?
智慧大石

TA贡献1946条经验 获得超3个赞

这是三重的方法 concat


m = pd.concat([pd.concat([left]*len(right)).sort_index().reset_index(drop=True),

       pd.concat([right]*len(left)).reset_index(drop=True) ], 1)


    col1  col2 col1  col2

0     A     1    X    20

1     A     1    Y    30

2     A     1    Z    50

3     B     2    X    20

4     B     2    Y    30

5     B     2    Z    50

6     C     3    X    20

7     C     3    Y    30

8     C     3    Z    50

//img1.sycdn.imooc.com//613c9a8f00010aad04960345.jpg

查看完整回答
反对 回复 2021-09-11
  • 3 回答
  • 0 关注
  • 357 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信