2016-10-26 11 views
5

Mam dwie tabele, które wyglądać następującoKorzystanie nagłówek kolumny i wartości z jednego dataframe znaleźć ciężarów w innym dataframe

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

i

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 

Jaki jest najlepszy sposób, aby wykonać pierwsze dataframe , sprawdź wagę każdego parametru w drugiej ramce danych i zwróć ramkę danych podobną do poniższej?

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

Co myślałem było napisać funkcję dany parametr i wartość, podzbiór tabela2 jak poniżej, table2[(table2['parameter'] = parameter) & (table2['value'] = value)] i robi jakieś vectorized zastosowania do każdej kolumny w tabeli 1., ale nie jestem pewien, jak przejrzyj każdą wartość i wykonaj wyszukiwanie.

Odpowiedz

5

Jednym rozwiązaniem byłoby przekształcenie table1 do długiego formatu, łączenie z table2 na temat parametrów i wartości, a następnie przekształcić go z powrotem do formatu szeroki:

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

Pęczek bicia się i wymyśliłem coś daleko gorsze od @Psidom. Przekonałem się tylko, by opublikować, aby uzyskać wgląd w uzyskanie tego samego rozwiązania za pomocą różnych technik.

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