2016-07-27 22 views
2

Ich habe zwei Datenrahmen wie untenPandas Datenrahmen zu Vergleichen und fügen Spalte

df1  df2 
A  A C 
A1  A1 C1 
A2  A2 C2 
A3  A3 C3 
A1  A4 C4 
A2   
A3   
A4   

Die Werte der Spalte ‚A‘ definiert, sind in Spalte DF2 in ‚C‘. Ich möchte eine neue Spalte hinzufügen mit Spalte B mit seinem Wert von DF2 Spalte ‚C‘

Der letzte df1 Mag ich

df1 
A B 
A1 C1 
A2 C2 
A3 C3 
A1 C1 
A2 C2 
A3 C3 
A4 C4 

aussehen sollte df1 können den Wert Schleife über DF2 und in den df1 aber es ist zeitaufwendig, da die Daten riesig sind.

Kann mir jemand helfen zu verstehen, wie kann ich das lösen, ohne df2 zu durchlaufen.

Dank

Antwort

1

IIUC Sie nur die

df1.merge(df2, on='A', how='left').rename(columns={'C':'B'}) 

In [103]: 
df1 = pd.DataFrame({'A':['A1','A2','A3','A1','A2','A3','A4']}) 
df2 = pd.DataFrame({'A':['A1','A2','A3','A4'], 'C':['C1','C2','C4','C4']}) 
merged = df1.merge(df2, on='A', how='left').rename(columns={'C':'B'}) 
merged 

Out[103]: 
    A B 
0 A1 C1 
1 A2 C2 
2 A3 C4 
3 A1 C1 
4 A2 C2 
5 A3 C4 
6 A4 C4 
+0

Vielen Dank für Ihren Vorschlag. Ich benutzte diese Lösung, da sie andere Spalten in df2 zu df1 zusammenführen würde. Danke @EdChum –

+0

Es gibt auch einen semantischen Unterschied zwischen 'merge' und' map' in dem, wenn das Nachschlagen in df1 in df2 nicht existiert, 'merge'' NaN' einfügt, während 'map' einen' KeyError' – EdChum

1

Sie map von Series col fusionieren können, und benennen Sie verwenden können:

df1['B'] = df1.A.map(df2.set_index('A')['C']) 
print (df1) 
    A B 
0 A1 C1 
1 A2 C2 
2 A3 C3 
3 A1 C1 
4 A2 C2 
5 A3 C3 
6 A4 C4 

Es ist die gleiche wie map von dict:

d = df2.set_index('A')['C'].to_dict() 
print (d) 
{'A4': 'C4', 'A3': 'C3', 'A2': 'C2', 'A1': 'C1'} 

df1['B'] = df1.A.map(d) 
print (df1) 
    A B 
0 A1 C1 
1 A2 C2 
2 A3 C3 
3 A1 C1 
4 A2 C2 
5 A3 C3 
6 A4 C4 

Timings:

len(df1)=7:

In [161]: %timeit merged = df1.merge(df2, on='A', how='left').rename(columns={'C':'B'}) 
1000 loops, best of 3: 1.73 ms per loop 

In [162]: %timeit df1['B'] = df1.A.map(df2.set_index('A')['C']) 
The slowest run took 4.44 times longer than the fastest. This could mean that an intermediate result is being cached. 
1000 loops, best of 3: 873 µs per loop 

len(df1)=70k:

In [164]: %timeit merged = df1.merge(df2, on='A', how='left').rename(columns={'C':'B'}) 
100 loops, best of 3: 12.8 ms per loop 

In [165]: %timeit df1['B'] = df1.A.map(df2.set_index('A')['C']) 
100 loops, best of 3: 6.05 ms per loop 
+0

auslöst Vielen Dank @jezreal –

+0

Hmmm, vielleicht können Sie alle Lösungen upvote, danke;) – jezrael

1

Basierend auf searchsorted Methode, hier sind drei Ansätze mit unterschiedlichen Indices -

df1['B'] = df2.C[df2.A.searchsorted(df1.A)].values 
df1['B'] = df2.C[df2.A.searchsorted(df1.A)].reset_index(drop=True) 
df1['B'] = df2.C.values[df2.A.searchsorted(df1.A)] 
Verwandte Themen