【问题标题】:Filtering a dataframe from information in another dataframe using Pandas使用 Pandas 从另一个数据框中的信息中过滤数据框
【发布时间】:2017-11-18 04:13:15
【问题描述】:

我有一个下面的数据框。

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]

【问题讨论】:

    标签: python pandas filter


    【解决方案1】:

    你可以试试这个:

    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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 2013-06-07
        • 2021-10-31
        • 2021-09-09
        • 2016-01-21
        • 2021-08-16
        相关资源
        最近更新 更多