Ich habe zwei Pandas-Datenrahmen:
from pandas import DataFrame
df1 = DataFrame({'col1':[1,2],'col2':[3,4]})
df2 = DataFrame({'col3':[5,6]})
Was ist die beste Vorgehensweise, um ihr kartesisches Produkt zu erhalten (natürlich ohne es explizit wie ich zu schreiben)?
#df1, df2 cartesian product
df_cartesian = DataFrame({'col1':[1,2,1,2],'col2':[3,4,3,4],'col3':[5,5,6,6]})
Verwendung
pd.MultiIndex.from_product
als Index in einem ansonsten leeren Datenrahmen, dann zurückgesetzt seinen Index, und du bist fertig.aus:
quelle
df1.col1
unddf.col2
).from_product
dass für dieses Problem verwendet werden kann.Dies wird keinen Code-Golf-Wettbewerb gewinnen und basiert auf den vorherigen Antworten - zeigt jedoch deutlich, wie der Schlüssel hinzugefügt wird und wie der Join funktioniert. Dadurch werden 2 neue Datenrahmen aus Listen erstellt und anschließend der Schlüssel für das kartesische Produkt hinzugefügt.
Mein Anwendungsfall war, dass ich für jede Woche in meiner Liste eine Liste aller Geschäfts-IDs benötigte. Also habe ich eine Liste aller Wochen erstellt, die ich haben wollte, und dann eine Liste aller Geschäfts-IDs, denen ich sie zuordnen wollte.
Die Zusammenführung, die ich gewählt habe, ist links, würde aber semantisch dieselbe sein wie die innere in diesem Setup. Sie können dies in der Dokumentation zum Zusammenführen sehen , die besagt, dass es sich um ein kartesisches Produkt handelt, wenn die Tastenkombination in beiden Tabellen mehrmals vorkommt - was wir eingerichtet haben.
quelle
days_and_stores = pd.merge(days.assign(key=0), stores.assign(key=0), on='key').drop('key', axis=1)
Minimaler Code für diesen benötigt. Erstellen Sie einen gemeinsamen 'Schlüssel' für die kartesische Zusammenführung der beiden:
quelle
df_cartesian = df_cartesian.drop(columns=['key'])
am EndeMit Methodenverkettung:
quelle
Alternativ kann man sich auf das kartesische Produkt von itertools: verlassen
itertools.product
, das das Erstellen eines temporären Schlüssels oder das Ändern des Index vermeidet:Schnell Test:
quelle
Wenn Sie keine überlappenden Spalten haben, keine hinzufügen möchten und die Indizes der Datenrahmen verworfen werden können, ist dies möglicherweise einfacher:
quelle
TypeError: '<class 'pandas.core.index.Int64Index'>' does not support mutable operations.
Ich kann dies, index=[0,0]
umgehen, indem ich die Datenrahmendefinition hinzufüge .df1 = df1.set_index([[0]*len(df1)]))
(und ähnlich fürdf2
).Hier ist eine Hilfsfunktion zum Ausführen eines einfachen kartesischen Produkts mit zwei Datenrahmen. Die interne Logik verwendet einen internen Schlüssel und verhindert, dass Spalten, die zufällig von beiden Seiten als "Schlüssel" bezeichnet werden, beschädigt werden.
zeigt an:
quelle
Sie könnten beginnen, indem Sie das kartesische Produkt von
df1.col1
und nehmendf2.col3
und dann wieder zusammenführen, umdf1
zu erhaltencol2
.Hier ist eine allgemeine kartesische Produktfunktion, die ein Wörterbuch mit Listen enthält:
Bewerben als:
quelle
Sie können numpy verwenden, da es schneller sein könnte. Angenommen, Sie haben zwei Serien wie folgt:
Du brauchst nur,
quelle
Ich finde die Verwendung von pandas MultiIndex das beste Werkzeug für diesen Job. Wenn Sie eine Liste mit Listen haben
lists_list
, rufenpd.MultiIndex.from_product(lists_list)
Sie das Ergebnis auf und wiederholen Sie es (oder verwenden Sie es im DataFrame-Index).quelle