两列pandas数据帧的交集

时间:2017-03-08 14:14:18

标签: python pandas dataframe

我有两个pandas数据框:MOV r0, #0 ;initialise loop index to 0 MOV r1, #100 ;number of iterations Loop: ADD r0, r0, #1 ;increment loop index CMP r0, r1 BLE Loop dataframe1,如下所示:

dataframe2

每行对应一个段(起始端)。 对于dataframe1中的每个段,我想根据分配给dataframe2中的段的值来分配值。

例如:

dataframe1 mydataframe1 Out[15]: Start End 100 200 300 450 500 700 mydataframe2 Out[16]: Start End Value 0 400 0 401 499 -1 500 1000 1 1001 1698 1 中的第一个分段包含在dataframe2 100 200的第一个分段中,那么我应该分配值0

dataframe1 0 400中的第二个段包含在dataframe2的第一个300 450和第二个0 400段中。在这种情况下,我需要将这些段拆分为2并分配2个相应的值。即401 499300 400 -> value 0

最终的dataframe1应该看起来像

401 - 450 value ->-1

我希望我能成为你的朋友。你能帮助我吗?

2 个答案:

答案 0 :(得分:1)

我怀疑有一个Pandas方法可以用来直接解决这个问题。 您必须手动计算交叉点以获得所需的结果。 intervaltree库使区间重叠计算至少更容易,更有效。

// Catch-all Route, sends GET requests to VueRouter // Route::get('{all?}', function() { return view('index'); })->where(['all' => '(.*)'])->name('catchall'); 返回与提供的间隔重叠的(完整)间隔,但不计算它们的交集。这就是为什么我也应用我定义的IntervalTree.search()函数。

intersect()

结果与您所追求的相同。

答案 1 :(得分:0)

以下是使用NCLS库的答案。它不会进行拆分,而是会回答标题中的问题,而且很快就会完成。

设置:

from ncls import NCLS

contents = """Start   End
100     200
300     450
500     700"""

import pandas as pd
from io import StringIO
df = pd.read_table(StringIO(contents), sep="\s+")

contents2 = """Start   End       Value
0       400       0
401     499       -1
500     1000      1
1001    1698      1"""
df2 = pd.read_table(StringIO(contents2), sep="\s+")

执行:

n = NCLS(df.Start.values, df.End.values, df.index.values)

x, x2 = n.all_overlaps_both(df2.Start.values, df2.End.values, df2.index.values)

dfx = df.loc[x]
# Start  End
# 0    100  200
# 0    100  200
# 1    300  450
# 2    500  700

df2x = df2.loc[x2]
# Start   End  Value
# 0      0   400      0
# 1    401   499     -1
# 1    401   499     -1
# 2    500  1000      1

dfx.insert(dfx.shape[1], "Value", df2x.Value.values)
# Start  End  Value
# 0    100  200      0
# 0    100  200      0
# 1    300  450     -1
# 2    500  700      1