根据条件在数据框中查找值

be8*_*e84 1 python if-statement vlookup dataframe pandas

我有一个主数据框和三个较小的数据框。最终,我想在主数据框中创建一个新列,指示每行是否满足两个条件。

  1. 主数据帧 A 列中的值出现在任何较小数据帧的 BB 列中。
  2. 对于 A 列和 BB 列的值匹配的行,主数据帧的 B 列与任何较小数据帧的列之间的差异小于 5。

为了简单起见,我只包含了较小的数据帧之一。

data = [['Tom', 10], ['Nick', 15], ['Juli', 14], ['Tom', 7], ['Juli', 9]]

main_df = pd.DataFrame(data, columns=['A', 'B'])

    A     B
0  Tom    10
1  Nick   15
2  Juli   14
3  Tom     7
4  Juli   9

data1 = [[5, 'Juli'], [17, 'Tom'], [6, 'Juli'], [8,'Tom']]

df1 = pd.DataFrame(data1, columns=['AA', 'BB'])

   AA   BB
0  5   Juli
1  17  Tom
2  6   Juli
3  8   Tom
Run Code Online (Sandbox Code Playgroud)

我希望我的最终数据框看起来像这样:

    A     B    C
0  Tom    10   X
1  Nick   15
2  Juli   14    
3  Tom    7    X
4  Juli   9    X
Run Code Online (Sandbox Code Playgroud)

我尝试过合并数据帧,但它创建了太多行并超出了 python 的限制。

moz*_*way 5

使用merge_asof公差:

tmp = (pd.merge_asof(main_df.reset_index().sort_values(by='B'),
                     df1.rename(columns={'BB': 'A', 'AA': 'B'})
                        .sort_values(by='B').assign(C='X'),
                     on='B', by='A', tolerance=5, direction='nearest'
                     )
         .set_index('index')['C'].fillna('')
      )

main_df['C'] = tmp
Run Code Online (Sandbox Code Playgroud)

输出:

      A   B  C
0   Tom  10  X
1  Nick  15   
2  Juli  14   
3   Tom   7  X
4  Juli   9  X
Run Code Online (Sandbox Code Playgroud)