【问题标题】:Is there a pandas function to filter a DataFrame by multiple value comparison?是否有通过多值比较过滤 DataFrame 的 pandas 函数?
【发布时间】:2021-02-13 19:25:09
【问题描述】:

我有两个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

数据帧 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 one 中的 Alt CHROM 和 POS 列进行匹配来过滤 dataframe 2。我只想保留与所有 3 列匹配的行。

到目前为止,我已经使用 for 循环完成了此操作,但速度很慢。有没有办法用 pandas 函数做到这一点?

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)]

【问题讨论】:

    标签: python pandas function dataframe


    【解决方案1】:

    您可以连接两个数据框并将匹配的行保留在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()]
    

    【讨论】:

    • 为什么不使用默认值`how='inner'?
    • 是的,更简洁,我只是觉得使用两个步骤更容易掌握。
    • 我尝试使用这种方法,但是它没有过滤数据框。我所看到的只是 data_frame_1 列现在位于 data_frame_2 中,但是所有值都设置为 NAN。当我运行第二条时,我最终得到一个空数据框。我尝试使用“how = inner”选项,但这也给了我一个空数据框。也许我应该指定数据框没有相似的维度。不确定这是否会影响功能。
    猜你喜欢
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2020-11-29
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多