2016-08-05 20 views
1

Wenn ich 2 Datenrahmen haben wie diese beiden:Pandas: Spalte erstellen Datenrahmen basierend auf anderen Datenrahmen

import pandas as pd 

df1 = pd.DataFrame({'Type':list('AABAC')}) 
df2 = pd.DataFrame({'Type':list('ABCDEF'), 'Value':[1,2,3,4,5,6]}) 

    Type 
0 A 
1 A 
2 B 
3 A 
4 C 

    Type Value 
0 A  1 
1 B  2 
2 C  3 
3 D  4 
4 E  5 
5 F  6 

Ich möchte eine Spalte in df1 hinzuzufügen basierend auf den Werten in df2. df2 enthält nur eindeutige Werte, während df1 für jeden Wert mehrere Einträge enthält. So sollte die resultierende df1 wie folgt aussehen:

Type Value 
0 A  1 
1 A  1 
2 B  2 
3 A  1 
4 C  3 

Meine eigentliche Datenrahmen df1 ziemlich lang ist, so dass ich brauche etwas, das effizient ist (Ich habe versucht, es in einer Schleife, aber das dauert ewig).

+0

durch 'die Werte' meinst du nur die Spalte 'Wert' in DF2? –

+2

Es gibt viele ähnliche Fragen und Ansätze dazu, haben Sie zum Beispiel "merge" in Betracht gezogen? – EdChum

+0

Ja, genau, basierend auf der Spalte 'Wert' – petetheat

Antwort

2

Sie dict von Ihrem df2 mit to_dict Methode erstellen könnte und dann map Ergebnis Type Spalte für df1:

replace_dict = dict(df2.to_dict('split')['data']) 

In [50]: replace_dict 
Out[50]: {'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5, 'F': 6} 

df1['Value'] = df1['Type'].map(replace_dict) 

In [52]: df1 
Out[52]: 
    Type Value 
0 A  1 
1 A  1 
2 B  2 
3 A  1 
4 C  3 
+2

Sie hätten den Index auf "Typ" auf "df2" gesetzt haben, also 'df1 ['Wert'] = df1 ['Typ']. map (df2.set_index ('Typ') ['Wert' ]) 'hätte auch funktioniert – EdChum

+0

@EdChum das funktioniert mit dem obigen Beispiel, aber nicht mit meinem vollständigen Datensatz' pandas.core.index.InvalidIndexError: Reindexing nur gültig mit einzigartig bewerteten Index-Objekten' – petetheat

+0

Es hilft uns, wenn Sie eine repräsentatives Beispiel, um aufzuhören, unsere Zeit damit zu verschwenden, Ihnen zu helfen, wenn Sie ein simples Beispiel veröffentlichen, erhalten Sie eine einfache Antwort. Veröffentlichen Sie entweder ein repräsentatives Beispiel oder Ihre realen Daten – EdChum

2

Da bat ich um eine Lösung bin Entsendung, die map ohne die Notwendigkeit, eine temporäre dict erstellen verwendet:

In[3]: 
df1['Value'] = df1['Type'].map(df2.set_index('Type')['Value']) 
df1 

Out[3]: 
    Type Value 
0 A  1 
1 A  1 
2 B  2 
3 A  1 
4 C  3 

Dies beruht auf ein paar Dinge, dass die Schlüsselwerte, die nachgeschlagen werden, oth erwise wir bekommen eine KeyError und dass wir keine doppelten Einträge in df2 haben keine Einstellung sonst den Index hebt InvalidIndexError: Reindexing only valid with uniquely valued Index objects

0

Ein anderer Weg, dies zu tun ist durch das Label mit Basis Indexer loc. Zunächst verwenden die Type Spalte als Index .set_index verwenden, dann Zugriff auf die df1 Spalte, und setzen Sie den Index auf das Original mit .reset_index:

df2.set_index('Type').loc[df1['Type'],:].reset_index() 

Entweder verwenden Sie diese als neue df1 oder extrahieren Sie die Value Säule:

df1['Value'] = df2.set_index('Type').loc[df1['Type'],:].reset_index()['Value'] 
Verwandte Themen