Ich habe 3 CSV-Dateien. Jede hat die erste Spalte als (Zeichenfolgen-) Namen von Personen, während alle anderen Spalten in jedem Datenrahmen Attribute dieser Person sind.
Wie kann ich alle drei CSV-Dokumente "zusammenfügen", um eine einzelne CSV zu erstellen, wobei jede Zeile alle Attribute für jeden eindeutigen Wert des Zeichenfolgennamens der Person enthält?
Die join()
Funktion in Pandas gibt an, dass ich einen Multiindex benötige, aber ich bin verwirrt darüber, was ein hierarchisches Indexierungsschema mit dem Erstellen eines Joins auf der Grundlage eines einzelnen Index zu tun hat.
df1.join([df2, df3], on=[df2_col1, df3_col1])
es nicht funktioniert.Antworten:
Angenommene Importe:
John Galts Antwort ist im Grunde eine
reduce
Operation. Wenn ich mehr als eine Handvoll Datenrahmen habe, würde ich sie in eine Liste wie diese einfügen (generiert über Listenverständnisse oder Schleifen oder so weiter):Angenommen, sie haben eine gemeinsame Spalte, wie
name
in Ihrem Beispiel, würde ich Folgendes tun:Auf diese Weise sollte Ihr Code mit einer beliebigen Anzahl von Datenrahmen funktionieren, die Sie zusammenführen möchten.
Bearbeiten 1. August 2016 : Für Benutzer von Python 3:
reduce
wurde verschobenfunctools
. Um diese Funktion nutzen zu können, müssen Sie zuerst das folgende Modul importieren:quelle
reduce
es durchfunctools.reduce
Soimport functools functools.reduce(.......)
name1
,name2
undname3
jeweils.n-1
die Merge-Funktion aufrufen? Ich denke, in diesem Fall, in dem die Anzahl der Datenrahmen gering ist, spielt es keine Rolle, aber ich frage mich, ob es eine skalierbarere Lösung gibt.df
s mit Spalten-Multi-Indizes nicht ganz (es wurde das 'on' als Spalte eingefügt, die für die erste Zusammenführung funktionierte, aber nachfolgende Zusammenführungen schlugen fehl), stattdessen musste ich damit arbeiten:df = reduce(lambda left, right: left.join(right, how='outer', on='Date'), dfs)
Sie können dies versuchen, wenn Sie 3 Datenrahmen haben
alternativ, wie von cwharland erwähnt
quelle
df1.merge(df2,on='name').merge(df3,on='name')
name1
,name2
undname3
jeweilsdf1.merge(df2,left_on='name1', right_on='name2').merge(df3,left_on='name1', right_on='name3').drop(columns=['name2', 'name3']).rename(columns={'name1':'name'})
Dies ist eine ideale Situation für die
join
MethodeDie
join
Methode ist genau für diese Art von Situationen ausgelegt. Sie können damit beliebig viele DataFrames verbinden. Der aufrufende DataFrame wird mit dem Index der Sammlung übergebener DataFrames verknüpft. Um mit mehreren DataFrames arbeiten zu können, müssen Sie die Verknüpfungsspalten in den Index einfügen.Der Code würde ungefähr so aussehen:
Mit den Daten von @ zero können Sie Folgendes tun:
quelle
pd.DataFrame().join(dfs, how="outer")
. Dies kann in einigen Situationen sauberer sein.pd.concat
zu einer einfacheren Syntax :pd.concat([df.set_index('name') for df in dfs], axis=1, join='inner').reset_index()
.concat
ist auch vielseitiger, wenn Sie mit doppelten Spaltennamen über mehrere dfs hinweg arbeiten (diesjoin
ist nicht so gut), obwohl Sie nur innere oder äußere Verknüpfungen damit durchführen können.dfs[0].join(dfs[1:])
sollte bearbeitet werden,dfs[0].join(dfs[1:], sort=False)
da sonst einFutureWarning
Wille auftaucht. Danke für das schöne Beispiel.ValueError: Indexes have overlapping values
, wenn ich das versuche: Obwohl die einzelnen Datenrahmen in der Liste überprüft werden, scheinen sie keine überlappenden Werte zu haben.Dies kann für eine Liste von Datenrahmen auch wie folgt erfolgen
df_list
:oder wenn sich die Datenrahmen in einem Generatorobjekt befinden (z. B. um den Speicherverbrauch zu reduzieren):
quelle
In
python
3.6.3 mitpandas
0.22.0 können Sie auchconcat
die Spalten verwenden, die Sie für die Verknüpfung verwenden möchten, solange Sie als Index festlegenwo
df1
,df2
unddf3
sind wie in John Galts Antwort definiertquelle
Man benötigt keinen Multiindex, um Join- Operationen durchzuführen. Man muss nur die Indexspalte richtig einstellen, für die die Verknüpfungsoperationen ausgeführt werden sollen (welcher Befehl
df.set_index('Name')
zum Beispiel).Die
join
Operation wird standardmäßig für den Index ausgeführt. In Ihrem Fall müssen Sie nur angeben, dass dieName
Spalte Ihrem Index entspricht. Unten ist ein BeispielEin Tutorial kann nützlich sein.
quelle
Hier ist eine Methode zum Zusammenführen eines Wörterbuchs mit Datenrahmen, während die Spaltennamen mit dem Wörterbuch synchron bleiben. Außerdem werden bei Bedarf fehlende Werte ausgefüllt:
Dies ist die Funktion zum Zusammenführen eines Diktats von Datenrahmen
OK, können Daten generiert und getestet werden:
quelle
Einfache Lösung:
Wenn die Spaltennamen ähnlich sind:
Wenn die Spaltennamen unterschiedlich sind:
quelle
Es gibt eine andere Lösung aus der Pandas-Dokumentation (die ich hier nicht sehe):
Verwendung der
.append
Mit
ignore_index=True
wird der Index des angehängten Datenrahmens ignoriert und durch den nächsten im Quellindex verfügbaren Index ersetzt.Wenn es unterschiedliche Spaltennamen gibt,
Nan
wird eingeführt.quelle
Die drei Datenrahmen sind
Lassen Sie uns diese Frames mit verschachteltem pd.merge zusammenführen
Los geht's, wir haben unseren zusammengeführten Datenrahmen.
Glückliche Analyse !!!
quelle