如何通过 python 中的 pandas 合并重现 R 中 foverlaps 的相同输出?

Posted

技术标签:

【中文标题】如何通过 python 中的 pandas 合并重现 R 中 foverlaps 的相同输出?【英文标题】:How to reproduce the same output of foverlaps in R with merge of pandas in python? 【发布时间】:2018-04-17 20:06:05 【问题描述】:

我正在使用foverlaps 函数在我的表的 R 中进行合并。但我需要使用 python 重现相同的输出。我进行了搜索,在 pandas 库中找到了 merge 函数。但即使使用此功能,我也无法重现相同的输出。

首先是 R 中的输出:

这是第一个表(间隔):

   V1 V2 intid
1:  1  5     1
2:  4  9     2
3:  6 12     3
4: 11 17     4
5: 18 20     5

这是第二张表(decomp):

   V1 V2 subid
1:  1  4     A
2:  4  5     B
3:  5  6     C
4:  6  9     D
5:  9 11     E
6: 11 12     F
7: 12 17     G
8: 17 18     H
9: 18 20     I

R 中进行合并的代码:

relations <- foverlaps(decomp, intervals, type='within', nomatch=0)

输出(关系):

    V1 V2 intid i.V1 i.V2 subid
 1:  1  5     1    1    4     A
 2:  1  5     1    4    5     B
 3:  4  9     2    4    5     B
 4:  4  9     2    5    6     C
 5:  4  9     2    6    9     D
 6:  6 12     3    6    9     D
 7:  6 12     3    9   11     E
 8:  6 12     3   11   12     F
 9: 11 17     4   11   12     F
10: 11 17     4   12   17     G
11: 18 20     5   18   20     I

现在我在 python 中的输出:

这是第一个表(df_of_pairs):

   V1  V2  intid
0   1   5      1
1   4   9      2
2   6  12      3
3  11  17      4
4  18  20      5

这是第二张表(df_of_adjacent):

   V1  V2 subid
0   1   4     A
1   4   5     B
2   5   6     C
3   6   9     D
4   9  11     E
5  11  12     F
6  12  17     G
7  17  18     H
8  18  20     I

现在是问题,当我使用 pandas 合并时,我没有在 python 中重现相同的输出。我尝试了几种方法,但都没有成功,这是我使用它的一种方法:

df = df_of_pairs.merge(df_of_adjacent, left_on=['V1'], right_on=['V2'] )

输出(df):

   V1_x  V2_x  intid  V1_y  V2_y subid
0     4     9      2     1     4     A
1     6    12      3     5     6     C
2    11    17      4     9    11     E
3    18    20      5    17    18     H

这个问题与R foverlaps equivalent in Python 非常相似,但在这种情况下它有不同的列。

【问题讨论】:

【参考方案1】:

我无法轻松获得您想要的确切输出,但这是使用 IntervalIndex 的部分解决方案。

s1 = pd.IntervalIndex.from_arrays(df1['V1'], df1['V2'])  # default: closed='right'
s2 = pd.IntervalIndex.from_arrays(df2['V1'], df2['V2'])
df_of_adjacent.set_index(s2, inplace=True)
df_of_adjacent.loc[s1]
          V1  V2 subid
(1, 4]     1   4     A
(4, 5]     4   5     B
(4, 5]     4   5     B
(5, 6]     5   6     C
(6, 9]     6   9     D
(6, 9]     6   9     D
(9, 11]    9  11     E
(11, 12]  11  12     F
(11, 12]  11  12     F
(12, 17]  12  17     G
(18, 20]  18  20     I

【讨论】:

感谢您的帮助!我会尝试使用这个功能。您知道可能解决此问题的其他功能吗?也许是 python 的另一个库? 你好@peter,我无法得到与你相同的输出!我的结果与原始数据框相同!会发生什么? @PabloPavan,我不知道有任何其他 python 包复制 R 的 foverlaps 的结果,但这两个线程看起来很相关:***.com/questions/40247095/…***.com/questions/30627968/… 至于你为什么获得与原始 DataFrame 相同的结果,您必须缺少 inplace=True 或者没有在我的答案中保存第三行的结果。

以上是关于如何通过 python 中的 pandas 合并重现 R 中 foverlaps 的相同输出?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过在 Python 中将两个列表合并为一个,使用 CSV 模块或 Pandas 写入 csv 或 Excel 文件?

如何使用 Python Pandas 合并多个 CSV 文件

如何在 Pandas Python 中合并时避免笛卡尔坐标

求助,使用Python合并多个EXCEL表格时,如果表格有密码,密码已知,该怎么通过pandas合并,

如何使用 Pandas 将多个 csv 文件中的单个数据列合并为一个?

如何利用 Python 批量合并 Excel?