Ich möchte zwei zusammenführen DataFrames
und den Index aus dem ersten Frame als Index für den zusammengeführten Datensatz beibehalten. Wenn ich jedoch die Zusammenführung durchführe, hat der resultierende DataFrame einen ganzzahligen Index. Wie kann ich angeben, dass der Index vom linken Datenrahmen ferngehalten werden soll?
In [4]: a = pd.DataFrame({'col1': {'a': 1, 'b': 2, 'c': 3},
'to_merge_on': {'a': 1, 'b': 3, 'c': 4}})
In [5]: b = pd.DataFrame({'col2': {0: 1, 1: 2, 2: 3},
'to_merge_on': {0: 1, 1: 3, 2: 5}})
In [6]: a
Out[6]:
col1 to_merge_on
a 1 1
b 2 3
c 3 4
In [7]: b
Out[7]:
col2 to_merge_on
0 1 1
1 2 3
2 3 5
In [8]: a.merge(b, how='left')
Out[8]:
col1 to_merge_on col2
0 1 1 1.0
1 2 3 2.0
2 3 4 NaN
In [9]: _.index
Out[9]: Int64Index([0, 1, 2], dtype='int64')
BEARBEITEN: Auf Beispielcode umgestellt, der leicht reproduziert werden kann
Antworten:
Hinweis: Bei einigen Linkszusammenführungsvorgängen werden möglicherweise mehr Zeilen angezeigt, wenn zwischen
a
und mehrere Übereinstimmungen bestehenb
und Sie eine Deduplizierung benötigen ( Dokumentation zur Deduplizierung ). Aus diesem Grund behält Pandas den Index nicht für Sie.quelle
a
Frame. reset_index verschiebt den Index in eine reguläre Spalte und set_index aus dieser Spalte nach dem Zusammenführen sorgt auch dafür, dass Zeilen von a aufgrund des Zusammenführungsvorgangs dupliziert / entfernt werden.a.reset_index().merge(b, how="left").set_index(a.index.names)
.Sie können eine Kopie des Index im linken Datenrahmen erstellen und zusammenführen.
Ich fand diese einfache Methode sehr nützlich, wenn ich mit großen Datenrahmen arbeitete und
pd.merge_asof()
(oderdd.merge_asof()
) verwendete.Dieser Ansatz wäre überlegen, wenn das Zurücksetzen des Index teuer ist (großer Datenrahmen).
quelle
Es gibt eine Lösung ohne pd.merge. Verwenden von
map
undset_index
Und führt keinen Dummy-
index
Namen für den Index ein.quelle
pd.Dataframe
und kein a erhaltenpd.Series
. Die.map()
Methode ist nur für die definiertpd.Series
. Das soll heißen:a[['to_merge_on_1', 'to_merge_on_2']].map(...)
funktioniert nicht.Dadurch kann der Index von df1 beibehalten werden
quelle
on=list_of_cols]
, widerspricht es der Dokumentation :If joining columns on columns, the DataFrame indexes *will be ignored*
. Hat die Verwendung von Indizes gegenüber Spalten Vorrang?Ich glaube, ich habe eine andere Lösung gefunden. Ich habe die linke Tabelle mit dem Indexwert und die rechte Tabelle mit einem Spaltenwert verbunden, der auf dem Index der linken Tabelle basiert. Was ich getan habe, war eine normale Zusammenführung:
Dann habe ich die neuen Indexnummern aus der zusammengeführten Tabelle abgerufen und in eine neue Spalte mit dem Namen Sentiment Line Number eingefügt:
Dann setze ich den Index manuell auf den ursprünglichen Index der linken Tabelle zurück, basierend auf der bereits vorhandenen Spalte mit dem Namen Zeilennummer (der Spaltenwert, den ich aus dem Index der linken Tabelle hinzugefügt habe):
Entfernen Sie dann den Indexnamen der Zeilennummer, damit er leer bleibt:
Vielleicht ein bisschen hacken, scheint aber gut und relativ einfach zu funktionieren. Vermutlich verringert es auch das Risiko von Duplikaten / Durcheinander Ihrer Daten. Hoffentlich macht das alles Sinn.
quelle
Eine andere einfache Option besteht darin, den Index in den vorherigen umzubenennen:
Beim Zusammenführen wird die Reihenfolge im Datenrahmen 'a' beibehalten, der Index wird jedoch nur zurückgesetzt, sodass die Verwendung von set_axis gespeichert wird
quelle