我有两个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 499
和300 400 -> value 0
最终的dataframe1应该看起来像
401 - 450 value ->-1
我希望我能成为你的朋友。你能帮助我吗?
答案 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