具有不同长度的另一个数据帧的子集数据帧

2024-06-06 08:03:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个相互作用的染色体对的数据帧,用染色体(chr)和位置(pos)表示,如下所示:

>>>import pandas as pd

>>>df1
chr1     pos1     chr2     pos2
chr1    54278    chr13    68798
chr1    32145     chr7  1248798
... 
[162689366 rows x 4 columns]

在实际数据集中,这些数据按chr1排序,然后按pos1、chr2、pos2排序。在

我有另一个数据集,其中包含我希望以以下格式查看的交互对:

^{pr2}$

当且仅当两个交互对(chr1-pos1&chr2-pos2)都在df2的开始和停止值范围内时,我希望将df1子集化以包含行。在

在本例中,最终的数据帧如下所示:

>>>df3
chr1    pos1      chr2     pos2
chr1    54278    chr13    68798
...

我一直在尝试在pandas中使用.between函数来完成这个步骤(第一个chr-pos对,然后是第二个chr-pos对),但没有成功。我试过python2.7和python3.6。在

>>>df3 = df1[(df1['chr1'].isin(df2.chr)) & df1['pos1'].between(df1.pos1(df2.start),df1.pos1(df2.stop))]

这似乎适用于.isin,但是.between函数有一个错误。我想是因为数据帧的长度不一样,但我不能确定。在

>>>df1['pos1'].between(df2.start,df2.stop)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/pandas/core/series.py", line 2412, in between
    lmask = self >= left
  File "/usr/lib/python2.7/dist-packages/pandas/core/ops.py", line 699, in wrapper
    raise ValueError('Series lengths must match to compare')
ValueError: Series lengths must match to compare

非常感谢任何帮助!在


Tags: 数据inpospandaslinebetweenfiledf1
2条回答

有人可能有一个更优雅的解决方案,但在我的头脑中,我会将df2与{}连接两次,这样就可以在一个数据集中获得所有内容,而且比较也很容易。在

df2基本上是一个查找表,df2.chr应该分别与df1.chr1和{}匹配。在

df_all = df1.merge(df2,
                   how='inner',
                   left_on='chr1',
                   right_on='chr') \
            .merge(df2,
                   how='inner',
                   left_on='chr2',
                   right_on='chr',
                   suffixes=('_r1', '_r2'))

注意后缀。因此,pos1将被测试在start_r1-stop_r1范围内,pos2将被测试在start_r2-stop_r2范围内。在

^{pr2}$

相关问题 更多 >