如何在特定条件下获得 pandas 数据框的笛卡尔积

How to get the cartesian product of a pandas dataframe under certain condition

给定一个数据框:

    qid cid title
0    1   a   croc 
1    2   b   dog    
2    3   a   fish
3    4   b   cat
4    5   a   bird

我想得到一个新的数据框,它是每行与具有相同 cid 值的其他行的笛卡尔积(即,获取具有相同 cid 的所有行对):

    cid1 cid2 qid1 title1 qid2 title2
0    a     a    1   croc    3    fish
1    a     a    1   croc    5    bird
2    a     a    3   fish    5    bird
3    b     b    2   dog     4    cat

假设我的数据集是500M左右,有没有人可以比较高效的解决这个问题?

一种方法是使用 self merge 然后过滤掉所有不需要的记录。

df.merge(df, on='cid', suffixes=('1','2')).query('qid1 < qid2')

输出:

    qid1 cid title1  qid2 title2
1      1   a   croc     3   fish
2      1   a   croc     5   bird
5      3   a   fish     5   bird
10     2   b    dog     4    cat