2016-05-26 20 views
1
import pandas as pd 

left = pd.DataFrame({'A': ['A1', 'A1', 'A2', 'A3'], 
        'B': ['B0', 'B1', 'B2', 'B3'], 
        'C': ['K0', 'K1', 'K0', 'K1']}) 

right = pd.DataFrame({'AA': ['A1', 'A3'], 
         'BB': ['B0', 'B3'], 
         'CC': ['K0', 'K1'], 
         'DD': ['D0', 'D1']}) 

ich durch Hinzufügen Spalte diese beiden Datenrahmen anschließen möchten zwei Datenrahmen fusionieren DD-left. Die Werte von DD sollten basierend auf Vergleichen von A und AA, B und BB, C und CC ausgewählt werden.Wie basierend auf unterschiedlichen Spaltennamen

Der einfache Beitritt Fall wäre wie unten gezeigt, aber in meinem Fall muss ich Spalten mit unterschiedlichen Namen vergleichen, und dann möchte ich nur DD zu right hinzufügen.

result = left.join(right, on='DD') 

sollte das Ergebnis sein:

result = pd.DataFrame({'A': ['A1', 'A1', 'A2', 'A3'], 
         'B': ['B0', 'B1', 'B2', 'B3'], 
         'C': ['K0', 'K1', 'K0', 'K1'], 
         'DD': ['D0', NaN, NaN, 'D1']}) 

Antwort

1

Verwenden Pandas merge Methode mit left_on und right_on Parameter.

left.merge(right, how='left', 
      left_on=['A', 'B', 'C'], 
      right_on=['AA', 'BB', 'CC'])[['A', 'B', 'C', 'DD']] 

bekommt man:

A B C DD 
0 A1 B0 K0 D0 
1 A1 B1 K1 NaN 
2 A2 B2 K0 NaN 
3 A3 B3 K1 D1 
1

Es sieht aus wie Sie merge wollen.

Im Moment stimmen die Spaltennamen jedoch nicht überein (A ist AA in right).
So lassen Sie uns zuerst sie normalisieren:

In [11]: right.columns = right.columns.map(lambda x: x[0]) 

Dann können wir uns auf die gemeinsamen Spalten verschmelzen:

In [12]: left.merge(right) 
Out[12]: 
    A B C D 
0 A1 B0 K0 D0 
1 A3 B3 K1 D1 

In [13]: left.merge(right, how="outer") 
Out[13]: 
    A B C D 
0 A1 B0 K0 D0 
1 A1 B1 K1 NaN 
2 A2 B2 K0 NaN 
3 A3 B3 K1 D1 
+0

Benötige ich auch Spalten von 'left' zu normalisieren? – JoeBlack

+0

@JoeBlack Der obige Code ist Arbeitscode. aber es hängt davon ab, was Ihr reales Leben Beispiel ist (und warum die gleichen Spalten in verschiedenen Datenrahmen unterschiedlich beschriftet sind, für mich sieht das wie etwas aus, das ich vor dem Zusammenführen/Starten von Berechnungen korrigieren möchte). –

Verwandte Themen