Python Pandas:DataFrame作为查找表

时间:2016-04-09 20:15:48

标签: python pandas dataframe lookup-tables

这是一个预处理的DataFrame,其中的列表示特定列的频率和成功值。例如:列A分别与FREQ_ASUCCESS_A相关联。

   A  B  Gold  FREQ_A  SUCCESS_A  FREQ_B  SUCCESS_B
0  1  B     0       1       0.00       1       0.00
1  2  A     1       1       0.01       1       0.01

我有另一个DataFrame,如下所示:

   A  B
0  1  A
1  2  B

现在,我想添加关联的频率和成功列(FREQ_*SUCCESS_** : {A,B}),查找预处理的DataFrame中的值。一个重要的观察是预处理的DataFrame具有相同的一组(非freq / success)列,但不是一组完整的键。 (请参阅行2A:3B:C不在预处理框架中)

例如:

数据框中的第一行的值为A = 1, B = A,因此:

FREQ_A将获取FREQ_A的原始数据框的值A == 1

FREQ_B将获取FREQ_B的原始数据框的值B == A

理想输出

   A  B  FREQ_A  SUCCESS_A  FREQ_B  SUCCESS_B
0  1  A       1       0.00       1       0.01
1  2  B       1       0.01       1       0.00

测试用例

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

1 个答案:

答案 0 :(得分:1)

df1 = pd.DataFrame({
 'A': [1, 2],
 'B': ['B', 'A'],
 'FREQ_A': [1, 1],
 'FREQ_B': [1, 1],
 'Gold': [0, 1],
 'SUCCESS_A': [0.0, 0.01],
 'SUCCESS_B': [0.0, 0.01]})

df2 = pd.DataFrame({'A': [1, 2], 'B': ['A', 'B']})

result = (df2
          .merge(df1[['A', 'FREQ_A', 'SUCCESS_A']], on='A')
          .merge(df1[['B', 'FREQ_B', 'SUCCESS_B']], on='B'))
>>> result
   A  B  FREQ_A  SUCCESS_A  FREQ_B  SUCCESS_B
0  1  A       1       0.00       1       0.01
1  2  B       1       0.01       1       0.00

修改

对于任意数据帧:

result = pd.concat(
    [df2, pd.concat([df2[[col]].merge(
                         df1[[col, 'FREQ_' + str(col), 'SUCCESS_' + str(col)]], 
                         on=col, how='left').iloc[:, 1:] 
                     for col in df2], axis=1)], 
    axis=1)