2016-10-26 21 views
5

Tôi có hai bảng trông giống như sauSử dụng tiêu đề cột và các giá trị từ một dataframe để tìm trọng lượng trong một dataframe

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

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 

gì là cách tốt nhất để có những dataframe đầu tiên , tra cứu trọng số của mỗi thông số trong khung dữ liệu thứ hai và trả lại một khung dữ liệu như sau?

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

Những gì tôi đã suy nghĩ là phải viết một chức năng nhất định các tham số và giá trị, tập hợp con table2 như sau, table2[(table2['parameter'] = parameter) & (table2['value'] = value)] và làm một số loại ứng dụng vectorized cho mỗi cột trong table1, nhưng Im không chắc chắn làm thế nào để đi qua từng giá trị và thực hiện tra cứu.

Trả lời

5

Một lựa chọn sẽ được chuyển table1 sang định dạng dài, kết hợp với table2 trên các thông số và giá trị, và sau đó biến nó trở lại định dạng rộng:

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

Một loạt các trận đòn về và tôi đã đưa ra một cái gì đó kém hơn so với @Psidom. Tôi chỉ thuyết phục bản thân mình đăng bài để cung cấp một số hiểu biết sâu sắc về việc nhận được cùng một giải pháp với các kỹ thuật khác nhau.

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 
Các vấn đề liên quan