2017-08-09 7 views
1

Étant donné un dataframe:Comment obtenir le produit cartésien d'une trame de données de pandas géants sous certaines conditions

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

Je veux obtenir une nouvelle trame de données qui est le produit cartésien de chaque rangée avec l'autre rangée qui a la même valeur cid comme (c'est d'obtenir toutes les paires de lignes avec le même 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 

mon jeu de données est Supposons à propos 500M, quelqu'un peut-il résoudre ce problème d'une manière relativement efficace?

Répondre

2

Une façon de le faire est d'utiliser un self merge puis filtrer tous les enregistrements indésirables.

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

Sortie:

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 
+1

thats va générer beaucoup de données. Bien que ce soit une belle réponse +1 – Dark