代码之家  ›  专栏  ›  技术社区  ›  jfive

Python Pandas:DataFrame作为查找表

  •  1
  • jfive  · 技术社区  · 8 年前

    这是一个预处理的DataFrame,列表示特定列的频率和成功值。例如:列 A 与关联 FREQ_A SUCCESS_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)列,但没有一组完整的键。(见第行 2 , A:3 B:C 不位于预处理帧中)

    例如:

    数据帧中的第一行具有值 A = 1, B = A ,因此:

    频率A 将采用原始数据帧的值 频率A 哪里 A == 1

    FREQ_B 将采用原始数据帧的值 频率_ 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 回复  |  直到 8 年前
        1
  •  1
  •   Alexander    8 年前
    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)