gpt4 book ai didi

python - 如何通过比较值范围来合并两个 pandas 数据帧(或传输值)

转载 作者:太空宇宙 更新时间:2023-11-03 13:33:03 24 4
gpt4 key购买 nike

在以下数据中:

data01 =

contig start end haplotype_block
2 5207 5867 1856
2 155667 155670 2816
2 67910 68022 2
2 68464 68483 3
2 525 775 132
2 118938 119559 1157

data02 =

contig start last feature gene_id gene_name transcript_id
2 5262 5496 exon scaffold_200003.1 CP5 scaffold_200003.1
2 5579 5750 exon scaffold_200003.1 CP5 scaffold_200003.1
2 5856 6032 exon scaffold_200003.1 CP5 scaffold_200003.1
2 6115 6198 exon scaffold_200003.1 CP5 scaffold_200003.1
2 916 1201 exon scaffold_200001.1 NA scaffold_200001.1
2 614 789 exon scaffold_200001.1 NA scaffold_200001.1
2 171 435 exon scaffold_200001.1 NA scaffold_200001.1
2 2677 2806 exon scaffold_200002.1 NA scaffold_200002.1
2 2899 3125 exon scaffold_200002.1 NA scaffold_200002.1

问题:

  • 我想比较这两个数据帧的范围(开始 - 结束)。
  • 如果范围重叠,我想将 gene_idgene_name 值从 data02 转移到 data01 中的新列。

我试过(使用 Pandas ):

data01['gene_id'] = ""
data01['gene_name'] = ""

data01['gene_id'] = data01['gene_id'].\
apply(lambda x: data02['gene_id']\
if range(data01['start'], data01['end'])\
<= range(data02['start'], data02['last']) else 'NA')

我该如何改进这段代码?我目前坚持使用 Pandas ,但如果使用字典可以更好地解决问题,我愿意接受。但是,请解释一下过程,我愿意学习而不只是得到答案。

谢谢,

期望的输出:

contig  start    end    haplotype_block    gene_id    gene_name
2 5207 5867 1856 scaffold_200003.1,scaffold_200003.1,scaffold_200003.1 CP5,CP5,CP5

# the gene_id and gene_name are repeated 3 times because three intervals (i.e 5262-5496, 5579-5750, 5856-6032) from data02 overlap(or touch) the interval ranges from data01 (5207-5867)

# So, whenever there is overlap of the ranges between two dataframe, copy the gene_id and gene_name.

# and simply NA on gene_id and gene_name for non overlapping ranges

2 155667 155670 2816 NA NA
2 67910 68022 2 NA NA
2 68464 68483 3 NA NA
2 525 775 132 scaffold_200001.1 NA
2 118938 119559 1157 NA NA

最佳答案

我知道您使用的是 python,但使用经典的生物信息学工具 bedtools intersect 可以轻松解决您的问题:http://bedtools.readthedocs.io/en/latest/content/tools/intersect.html

您的两个输入文件都遵循标准 BED 格式:http://bedtools.readthedocs.io/en/latest/content/general-usage.html

Bedtools intersect 为您提供了高级逻辑,用于确定什么构成两个区域之间的交叉或重叠。我相信它也可以直接对 bgzipped 输入进行操作。

关于python - 如何通过比较值范围来合并两个 pandas 数据帧(或传输值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43475370/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com