繁体   English   中英

如何在 pandas 中的另一个 DataFrame 的 2 列之间具有特定值的 select 行?

[英]How to select rows with certain value between 2 columns from another DataFrame in pandas?

例如,我有 2 个框架,第一个是我想要 select 行的那个,第二个包含用于选择的条件。

df1 = pd.DataFrame({'chr': {0: 7, 1: 7, 2: 7, 3: 7, 4: 7, 5: 7, 6: 7},
 0: {0: 55241686,
  1: 55242415,
  2: 55248986,
  3: 55259412,
  4: 55260459,
  5: 55266410,
  6: 55268009},
 1: {0: 55241736,
  1: 55242513,
  2: 55249171,
  3: 55259567,
  4: 55260534,
  5: 55266556,
  6: 55268064}})

df1

df2 = pd.DataFrame({'chr': {0: 7,
  1: 7,
  2: 7,
  3: 7,
  4: 7,
  5: 7,
  6: 7,
  7: 7,
  8: 7,
  9: 7,
  10: 7,
  11: 7,
  12: 7,
  13: 7,
  14: 7,
  15: 7,
  16: 7,
  17: 7,
  18: 7,
  19: 7},
 's': {0: 55241646,
  1: 55241658,
  2: 55241690,
  3: 55241718,
  4: 55241721,
  5: 55241722,
  6: 55241727,
  7: 55241732,
  8: 55242454,
  9: 55242457,
  10: 55242488,
  11: 55242511,
  12: 55248991,
  13: 55248995,
  14: 55248995,
  15: 55249000,
  16: 55249022,
  17: 55249036,
  18: 55249053,
  19: 55249057},
 'e': {0: 55241646,
  1: 55241658,
  2: 55241690,
  3: 55241718,
  4: 55241721,
  5: 55241722,
  6: 55241727,
  7: 55241732,
  8: 55242454,
  9: 55242457,
  10: 55242488,
  11: 55242511,
  12: 55248991,
  13: 55248995,
  14: 55248995,
  15: 55249000,
  16: 55249022,
  17: 55249036,
  18: 55249053,
  19: 55249057},
 'ref': {0: 'T',
  1: 'T',
  2: 'A',
  3: 'G',
  4: 'C',
  5: 'G',
  6: 'G',
  7: 'A',
  8: 'G',
  9: 'G',
  10: 'C',
  11: 'G',
  12: 'C',
  13: 'G',
  14: 'G',
  15: 'G',
  16: 'G',
  17: 'G',
  18: 'C',
  19: 'C'},
 'alt': {0: 'C',
  1: 'G',
  2: 'C',
  3: 'A',
  4: 'T',
  5: 'A',
  6: 'A',
  7: 'G',
  8: 'A',
  9: 'A',
  10: 'T',
  11: 'A',
  12: 'G',
  13: 'A',
  14: 'C',
  15: 'A',
  16: 'C',
  17: 'A',
  18: 'G',
  19: 'T'}})

df2 这里只展示了一小部分。

df2

我想要实现的是

对于 df1 中的每一行,如果此行 (row_df1) 与 df2 (row_df2) 中的某些行匹配(匹配意味着 row_df1['chr']==row_df2['chr'] & row_df1[0] >= row_df2['s '] & row_df1 1 <= row_df2['e']

简单来说,

如果该值落入由 df2['s'] 和 df2['e'] 构造的特定区间,则返回它。

我相信对您来说最好的情况是首先使用一个公共列合并两个数据框。 在你的情况下“chr”。 例如,据我了解,您想要 df1 中存在 df2 的所有“chr”,所以在这种情况下,您只需执行以下操作:

merged_df = df1.merge(df2, on='chr', how='left') 

在合并中,您可以使用“indicator=True”,它将为您创建一个名为“_merge”的新列,该列将指示每一行的来源。

现在,当您合并数据时,您可以制作简单的条件语句来获取所有需要的列,例如:

merged_df.loc[(merged_df[0] >= merged_df['s']) & (merged_df[1] >= merged_df ['e'])]

或者,您可以使用 apply 等添加一个新列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM