是否有熊猫函数通过多值比较来过滤DataFrame?

时间:2020-10-31 15:43:30

标签: python pandas function dataframe

我有两个pd DataFrames,我想通过检查另一个dataFrame的同一行中是否存在几列的值来过滤其中一个。

示例DataFrame1:

   CHROM POS  ALT  Col4
r1   X    22   A    4
r2   1    43   T    6
r3   3   100   C    7
r4  15    22   A    13

DataFrame 2:

   ALT   chrom   Col3  Col4  start
r1  A      X      25    26    22
r2  A      1      18    19    26
r3  C      3      99    10   100
r4  T      1     100    88    43

我想通过匹配ALT chrome和start列与dataframe 2中的Alt CHROM和POS列来过滤dataframe one。我只想保留与所有3列匹配的行。

到目前为止,我已经使用for循环完成了此操作,但是它相当慢。有没有办法用熊猫函数做到这一点?

p = []
for x in dataframe1.index:
  for y in dataframe2.index:
    if (dataframe2.chrom[y] == str(dataframe1.CHROM[x])) and (datafrmae2.start[y] == dataframe1.POS[x]) and (dataframe2.Alt[y] == dataframe1.ALT[x]): 
      p.append(y)

dataframe2_filt = dataframe2[dataframe2.index.isin(p)]

1 个答案:

答案 0 :(得分:0)

您可以同时连接两个数据框,并将匹配的行保留在dataframe_1中:

dataframe2_joined = pd.merge(dataframe_2, 
                             dataframe_1, 
                             left_on=['ALT', 'chrom', 'start'],
                             right_on=['ALT', 'Chrom', 'POS'],
                             how='left')
dataframe2_filt = dataframe2_merged[dataframe2_merged.POS.notnull()]