Ich entschuldige mich im Voraus, wenn dies abgedeckt wurde, konnte ich so etwas nicht finden. Dies ist mein erster Programmierjob (ich war zuvor Software-QS) und ich habe meinen Kopf gegen eine Wand geschlagen.

Ich habe 2 Datenrahmen, einer ist sehr groß [df2] (14,6 Millionen Zeilen) und ich durchlaufe ihn in Blöcken. Ich habe versucht, eine gleichnamige Spalte in jedem Datenrahmen zu vergleichen. Wenn sie gleich sind, möchte ich eine sekundäre Spalte des größeren Rahmens ausgeben.

D.h.

if df1['tag'] == df2['tag']:
   df1['new column'] = df2['plate']

Ich habe versucht, eine Zusammenführung durchzuführen, aber diese hat nicht das ausgegeben, was ich erwartet hatte.

df3 = pd.merge(df1, df2, on='tag', how='left')

Ich hoffe, ich habe gute Arbeit geleistet, um das zu erklären.

[Bearbeiten:] Ich glaube auch, dass ich erwähnen sollte, dass df2 und df1 beide viele zusätzliche Spalten haben, mit denen ich nicht interagieren / ändern möchte. Ist es möglich, nur die einzelnen Spalten zweier Datenrahmen zu vergleichen und die dritte zusätzliche Spalte auszugeben?

1
seclusion 17 Apr. 2018 im 22:37

3 Antworten

Beste Antwort

Sie können versuchen, inner zusammenzuführen. Zuerst können Sie inner merge df1 mit df2 und dann erhalten Sie plates nur für allgemeine Zeilen und können die neue df1's Spalte nach Bedarf umbenennen

df1 = df1.merge(df2, on="tag", how = 'inner')

df1['new column'] = df1['plate']
del df1['plate']

Ich hoffe das funktioniert.

1
DJK 17 Apr. 2018 im 20:09

Dies ist völlig der Fall für join/merge. Sie möchten df2 links setzen, weil es kleiner ist.

df2.join(df1, on='tag', ...)

Sie haben nur die Art der Verknüpfung / Zusammenführung) missverstanden, die Sie vornehmen möchten ::

wie: {'links', 'rechts', 'außen', 'inner'}, Standard: 'links'

'how' = 'left' join würde einen (unerwünschten) Eintrag für alle Zeilen des LHS df2 erstellen. Das ist nicht ganz das, was Sie wollen (wenn df2 andere Tag-Werte enthält, die in df1 nicht zu sehen sind, erhalten Sie auch Einträge für diese).

'how' = 'inner' würde den Schnittpunkt von df2 und df1 im Feld 'on' = 'tag' bilden. d.h. Sie erhalten nur Einträge, für die df1 einen gültigen Tag-Wert gemäß df2 enthält.

So:

df3 = df2.join(df1, on='tag', how='inner')
# then reference df3['plate']

Oder wenn Sie nur die Spalte 'Platte' in df3 (oder eine andere Auswahl von Spalten) möchten, können Sie direkt Folgendes tun:

df2.join(df1, on='tag', how='inner') ['plate']
0
smci 17 Apr. 2018 im 22:38

Wie bereits erwähnt, ist dies der perfekte Zeitpunkt, um Join / Merge zu verwenden. Wenn Sie df1 beibehalten möchten, ist eine linke Verknüpfung genau das, was Sie möchten. Sie waren also auf dem richtigen Weg:

df1 = pd.merge(df1['tag'],
               df2['tag', 'plate'],
               on='tag', how='left')
df1.rename({'plate': 'new column'}, axis='columns')

Dadurch werden nur die tag - Spalten in jedem Datenrahmen verglichen, sodass die anderen Spalten keine Rolle spielen. Die plate - Spalte wird von df2 übernommen und anschließend in die gewünschte neue Spalte umbenannt.

0
RCA 17 Apr. 2018 im 20:06