python - 使用 pandas,找到两个 DataFrame 之间的相交区域?
问题描述
我有两个熊猫数据框,使用 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
。因此,在 155 到 200feature2
处feature3
相交。在 900 到 901 处重叠。df2
feature4
df2
找到交叉点最有效(就运行时间和 RAM 而言)是什么?
编辑:有一个 Python 包在这里做类似的事情:https ://daler.github.io/pybedtools/intersections.html
解决方案
import pandas as pd
df1 = pd.DataFrame({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:['+','+','-','+','+']})
df2 = pd.DataFrame({0:['chr1','chr1'], 1:[155, 800], 2:[200, 901],
3:['feature5', 'feature6'], 4:[0, 0], 5:['-','+']})
您可以使用apply
和一些逻辑测试来查找重叠。不过,您必须遍历染色体组。您应该能够做类似的事情来查找和修复需要调整的开始和停止。如果以后有时间,我会为它写一些东西。
new_dfs = []
for chr_name, chr_df in df1.groupby(0):
chr_df2 = df2.loc[df2[0] == chr_name]
overlapping = (chr_df[1].apply(lambda x: chr_df2[2] >= x) & chr_df[2].apply(lambda x: chr_df2[1] <= x)).any(axis=1)
new_dfs.append(chr_df.loc[overlapping, :])
new_dfs = pd.concat(new_dfs)
总的来说,这将是内存效率的,但不是超级快。如果你想要快速,你可能不得不编写一些复杂的索引。
推荐阅读
- android - 如果用户没有互联网连接,我如何获得固定项目
- python - 数据框的边距
- c++ - 在 C/C++ 中是否可以在编译时将函数名称放入代码中?
- bash - 在 sh 中拆分和处理文本文件
- powerbi - PowerBI 按类型过滤
- c# - File.Exists() 不适用于使用 app.UseStaticFiles()
- azure - Azure blob 图像未正确显示
- php - 如何使用依赖注入封装 League Flysystem
- rest - HP QC ALM REST API:(缺少必填字段)创建新缺陷 POWERSHELL
- typo3 - TYPO3 中翻译的错误本地化