【发布时间】:2019-11-27 18:48:07
【问题描述】:
我有两个 pandas 数据框,使用 python3.x:
import pandas as pd
dict1 = {0:['chr1','chr1','chr1','chr1','chr2'],
1:[1, 100, 150, 900, 1], 2:[100, 200, 500, 950, 100],
3:['feature1', 'feature2', 'feature3', 'feature4', 'feature4'],
4:[0, 0, 0, 0, 0], 5:['+','+','-','+','+']}
df1 = pd.DataFrame(dict1)
print(df1)
## 0 1 2 3 4 5
## 0 chr1 1 100 feature1 0 +
## 1 chr1 100 200 feature2 0 +
## 2 chr1 150 500 feature3 0 -
## 3 chr1 900 950 feature4 0 +
## 4 chr2 1 100 feature4 0 +
dict2 = {0:['chr1','chr1'], 1:[155, 800], 2:[200, 901],
3:['feature5', 'feature6'], 4:[0, 0], 5:['-','+']}
df2 = pd.DataFrame(dict2)
print(df2)
## 0 1 2 3 4 5
## 0 chr1 155 200 feature5 0 -
## 1 chr1 800 901 feature6 0 +
这些数据框中要关注的列是前三列:位置、开始和结束。每个 start:end 值表示位置上的距离(例如chr1、chr2、chr3)。
我想输出df1 与df2 的交集。这是正确的输出:
chr1 155 200 feature2 0 +
chr1 155 200 feature3 0 -
chr1 900 901 feature4 0 +
解释:我们找到df1 与df2 的交集。所以,feature2 和 feature3 在 155 到 200 处相交 df2。feature4 在 900 到 901 处重叠 df2。
什么是最有效的(就运行时间和 RAM 而言)找到交叉点?
编辑:这里有一个类似的 Python 包:https://daler.github.io/pybedtools/intersections.html
【问题讨论】:
-
您想返回第一个 GFF 中与第二个 GFF 中的特征重叠的特征,并将位置子集仅包含在您的第二个 GFF 中?
-
@CJR 是的,没错。目前,我脑海中的第一个“小步骤”是忽略这些特征,并确保我的重叠间隔正确。
-
所以如果其中一个。 df2.start == df1.start 或 b。 df2.end == df2.end,你应该保留那行吗?在这种情况下,还不清楚什么位置、开始和结束。我认为为简单起见,您应该通过数据框中的列名来引用这些列。
-
@LiamShalon 是的,但请注意这不是我保留的行——它是重叠的位置。
chr1 900 901 feature4 0 +不是现有行(这可能很清楚) -
@EB2127 我不清楚是什么构成了应包含在您的交叉点数据框中的内容
标签: python python-3.x pandas dataframe merge