171 votes

produit cartésien dans pandas

J'ai deux dataframes pandas :

from pandas import DataFrame
df1 = DataFrame({'col1':[1,2],'col2':[3,4]})
df2 = DataFrame({'col3':[5,6]})     

Quelle est la meilleure pratique pour obtenir leur produit cartésien (bien sûr sans l'écrire explicitement comme moi) ?

#df1, df2 cartesian product
df_cartesian = DataFrame({'col1':[1,2,1,2],'col2':[3,4,3,4],'col3':[5,5,6,6]})

178voto

Matti John Points 2734

Dans les versions récentes de Pandas (>= 1.2), cette fonction est intégrée dans le module merge pour que vous puissiez le faire :

from pandas import DataFrame
df1 = DataFrame({'col1':[1,2],'col2':[3,4]})
df2 = DataFrame({'col3':[5,6]})    

df1.merge(df2, how='cross')

Ceci est équivalent à la réponse précédente de pandas < 1.2 mais est plus facile à lire.


Pour pandas < 1.2 :

Si vous avez une clé qui est répétée pour chaque ligne, vous pouvez alors produire un produit cartésien en utilisant la fusion (comme vous le feriez en SQL).

from pandas import DataFrame, merge
df1 = DataFrame({'key':[1,1], 'col1':[1,2],'col2':[3,4]})
df2 = DataFrame({'key':[1,1], 'col3':[5,6]})

merge(df1, df2,on='key')[['col1', 'col2', 'col3']]

Sortie :

   col1  col2  col3
0     1     3     5
1     1     3     6
2     2     4     5
3     2     4     6

Voir ici pour la documentation : http://pandas.pydata.org/pandas-docs/stable/merging.html

109voto

Gijs Points 3952

Utilisez pd.MultiIndex.from_product comme un index dans un cadre de données autrement vide, puis réinitialiser son index, et vous avez terminé.

a = [1, 2, 3]
b = ["a", "b", "c"]

index = pd.MultiIndex.from_product([a, b], names = ["a", "b"])

pd.DataFrame(index = index).reset_index()

dehors :

   a  b
0  1  a
1  1  b
2  1  c
3  2  a
4  2  b
5  2  c
6  3  a
7  3  b
8  3  c

46voto

A.Kot Points 3343

Un minimum de code est nécessaire pour celui-ci. Créez une "clé" commune pour fusionner cartésiennement les deux :

df1['key'] = 0
df2['key'] = 0

df_cartesian = df1.merge(df2, how='outer')

38voto

Rob Guderian Points 528

Cette réponse ne gagnera pas un concours de golf codé et emprunte les réponses précédentes, mais elle montre clairement comment la clé est ajoutée et comment la jointure fonctionne. Cela crée 2 nouveaux cadres de données à partir de listes, puis ajoute la clé pour faire le produit cartésien.

Mon cas d'utilisation était que j'avais besoin d'une liste de tous les identifiants de magasin pour chaque semaine de ma liste. J'ai donc créé une liste de toutes les semaines que je voulais avoir, puis une liste de tous les identifiants de magasin que je voulais associer à ces semaines.

La fusion que j'ai choisie est à gauche, mais serait sémantiquement la même qu'à l'intérieur dans cette configuration. Vous pouvez voir ceci dans la documentation sur la fusion Il s'agit d'un produit cartésien si la combinaison de clés apparaît plus d'une fois dans les deux tables, ce qui est notre cas.

days = pd.DataFrame({'date':list_of_days})
stores = pd.DataFrame({'store_id':list_of_stores})
stores['key'] = 0
days['key'] = 0
days_and_stores = days.merge(stores, how='left', on = 'key')
days_and_stores.drop('key',1, inplace=True)

25voto

pomber Points 1046

Avec le chaînage des méthodes :

product = (
    df1.assign(key=1)
    .merge(df2.assign(key=1), on="key")
    .drop("key", axis=1)
)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X