2016-10-26 3 views
5

ich zwei Tabellen, die dieMit Spaltenkopf und Werte von einem Datenrahmen Gewichte in einem anderen Datenrahmen finden

ID param1 param2 param3 
0 A12  2  1  1 
1 B15  1  2  1 
2 B20  2  2  1 
... 

und

folgt aussehen wie
parameter value weight 
0  param1  1  10 
1  param1  2  13 
2  param2  1  21 
3  param2  2  39 
4  param3  1  49 
5  param3  2  61 

was der beste Weg ist der erste Datenrahmen zu nehmen , nach dem Gewicht jedes Parameters im zweiten Datenrahmen suchen und einen Datenrahmen wie folgt zurückgeben?

ID param1 param2 param3 
0 A12  13  21  49 
1 B15  10  39  49 
2 B20  13  39  49 

Was ich dachte, war eine Funktion der Parameter und Wert, Teilmenge table2 wie die folgenden, table2[(table2['parameter'] = parameter) & (table2['value'] = value)] und dabei eine Art von vektorisiert Anwendung auf jede Spalte in Tabelle 1, aber ich bin nicht sicher, gegeben zu schreiben, wie man gehe über jeden Wert und mache die Suche.

Antwort

5

Eine Option wäre table1 zu langes Format zu transformieren, fusioniert mit table2 auf Parameter und Werten, und es dann auf Wide-Format umwandeln zurück:

In [85]: pd.merge(pd.melt(df1, id_vars='ID'), df2, 
        left_on=['variable', 'value'], right_on=['parameter', 'value'] 
        ).pivot('ID', 'parameter', 'weight') 
Out[85]: 
parameter param1 param2 param3 
ID 
A12   13  21  49 
B15   10  39  49 
B20   13  39  49 
2

Ein Bündel von Dreschen über und ich kam mit etwas nach oben weit unter @Psidom. Ich habe mich nur dazu überreden lassen, einen Einblick zu geben, wie ich mit verschiedenen Techniken zur selben Lösung kommen kann.

In [55]: (df1.set_index('ID') 
      .rename_axis('parameter', 1) 
      .stack() 
      .reset_index(name='value') 
      .merge(df2) 
      .set_index(['ID', 'parameter']).weight.unstack()) 
Out[55]: 
parameter param1 param2 param3 
ID 
A12   13  21  49 
B15   10  39  49 
B20   13  39  49 
Verwandte Themen