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]})
Utilisez
pd.MultiIndex.from_product
comme index dans un dataframe autrement vide, puis réinitialisez son index, et vous avez terminé.en dehors:
la source
df1.col1
etdf.col2
).from_product
puisse être utilisé pour ce problème.Cela ne gagnera pas une compétition de golf de code et emprunte aux réponses précédentes - mais montre clairement comment la clé est ajoutée et comment la jointure fonctionne. Cela crée 2 nouvelles trames de données à partir de listes, puis ajoute la clé sur laquelle effectuer 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 avec lesquels je voulais les mapper.
La fusion que j'ai choisie est gauche, mais serait sémantiquement la même que celle interne dans cette configuration. Vous pouvez le voir dans la documentation sur la fusion , qui indique qu'il fait un produit cartésien si la combinaison de touches apparaît plus d'une fois dans les deux tables - ce que nous avons configuré.
la source
days_and_stores = pd.merge(days.assign(key=0), stores.assign(key=0), on='key').drop('key', axis=1)
Code minimal nécessaire pour celui-ci. Créez une `` clé '' commune pour fusionner les deux cartésiens:
la source
df_cartesian = df_cartesian.drop(columns=['key'])
pour nettoyer à la finAvec chaînage de méthodes:
la source
En alternative, on peut s'appuyer sur le produit cartésien fourni par itertools:,
itertools.product
ce qui évite de créer une clé temporaire ou de modifier l'index:Test rapide:
la source
Si vous n'avez pas de colonnes qui se chevauchent, que vous ne voulez pas en ajouter et que les index des trames de données peuvent être supprimés, cela peut être plus facile:
la source
TypeError: '<class 'pandas.core.index.Int64Index'>' does not support mutable operations.
je peux contourner cela en ajoutant, index=[0,0]
à la définition du dataframe.df1 = df1.set_index([[0]*len(df1)]))
(et de même pourdf2
).Voici une fonction d'aide pour réaliser un produit cartésien simple avec deux blocs de données. La logique interne gère l'utilisation d'une clé interne et évite de modifier les colonnes qui se trouvent être nommées «clé» de chaque côté.
spectacles:
la source
Vous pouvez commencer par prendre le produit cartésien de
df1.col1
etdf2.col3
, puis fusionner à nouveaudf1
pour obtenircol2
.Voici une fonction produit cartésienne générale qui prend un dictionnaire de listes:
Postulez comme:
la source
Vous pouvez utiliser numpy car cela pourrait être plus rapide. Supposons que vous ayez deux séries comme suit,
Vous avez juste besoin,
la source
Je trouve que l'utilisation de pandas MultiIndex est le meilleur outil pour le travail. Si vous avez une liste de listes
lists_list
, appelezpd.MultiIndex.from_product(lists_list)
et parcourez le résultat (ou utilisez-le dans l'index DataFrame).la source