猿问

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

这篇文章的内容最初是作为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  col2

0    A     1

1    B     2

2    C     3


right


  col1  col2

0    X    20

1    Y    30

2    Z    50

可以计算这些帧的叉积,如下所示:


A       1      X      20

A       1      Y      30

A       1      Z      50

B       2      X      20

B       2      Y      30

B       2      Z      50

C       3      X      20

C       3      Y      30

C       3      Z      50

计算此结果的最高效方法是什么?


神不在的星期二
浏览 358回答 3
3回答

拉莫斯之舞

在熊猫 1.2.0 之后merge现在有选项crossleft.merge(right, how='cross')使用itertools product和重新创建数据帧中的值import itertoolsl=list(itertools.product(left.values.tolist(),right.values.tolist()))pd.DataFrame(list(map(lambda x : sum(x,[]),l)))   0  1  2   30  A  1  X  201  A  1  Y  302  A  1  Z  503  B  2  X  204  B  2  Y  305  B  2  Z  506  C  3  X  207  C  3  Y  308  C  3  Z  50

智慧大石

这是三重的方法 concatm = 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  col20     A     1    X    201     A     1    Y    302     A     1    Z    503     B     2    X    204     B     2    Y    305     B     2    Z    506     C     3    X    207     C     3    Y    308     C     3    Z    50
随时随地看视频慕课网APP

相关分类

Python
我要回答