使用 Pandas 从另一个数据帧中的信息过滤数据帧



我有一个数据帧在下面。

df = pd.DataFrame(columns=['Chromosome', 'Start','End'],
data=[
['chr1', 2000, 3000],
['chr1', 500, 1500],
['chr3', 3000, 4000],
['chr5', 4000, 5000],
['chr17', 9000, 10000],
['chr19', 1500, 2500]
])

我有一个探测数据帧,如下所示。

probes = pd.DataFrame(columns=['Probe', 'Chrom','Position'],
data=[
['CG999', 'chr1', 2500],
['CG000', 'chr19, 2000],
])

我想过滤 df 中包含探针染色体的行,并且它的开始和结束数字之间有探针位置,然后将探针名称添加到 df 中的新列/字段中。所需的输出如下:

Probe    Chrom    Start    End
0   CG999    chr1     2000     3000
5   CG000    chr19    1500     2500

我在下面的尝试有效,但没有将探测器名称放入 Probe 列中,而是依赖于循环探测器数据。必须有一种更有效的方法来做到这一点。

all_indexes = []
# fake2.tsv is the aforementioned probes dataframe
with open('fake2.tsv') as f:
for x in f:
probe, chrom, pos = x.rstrip("n").split("t")
row = df[(df['Chromosome'] == chrom) & ((int(pos) > df['Start']) & (int(pos) < df['End']))]
all_indexes.append(t.index.tolist())
all_t = [y for x in all_t for y in x]
df.iloc[all_indexes]

你可以试试这个:

df.merge(probes, left_on='Chromosome', right_on='Chrom').query('Start < Position < End')

输出:

Chromosome  Start   End  Probe  Chrom  Position
0       chr1   2000  3000  CG999   chr1      2500
2      chr19   1500  2500  CG000  chr19      2000

我刚刚遇到了同样的问题,显然熊猫中没有内置的解决方案。但是,您可以在以下线程上使用解决方案:

  • 在熊猫中按范围加入/合并的最佳方式

  • 如何执行数据帧与熊猫的内联接或外联接 非简单标准

最新更新