Есть два блока данных pandas, которые у меня есть, которые я хотел бы объединить с правилом.Как объединить два кадра данных pandas с условным?
Это первый dataframe
import pandas as pd
df1 = pd.Dataframe()
df1
rank begin end labels
first 30953 31131 label1
first 31293 31435 label2
first 31436 31733 label4
first 31734 31754 label1
first 32841 33037 label3
second 33048 33456 label4
....
Второй dataframe только две колонки, rank
и start
df2
rank start
first 31333
first 31434
first 33039
first 33123
first 33125
В первом dataframe df1
, данные имеют begin
и end
. Я хотел бы проверить, находится ли целое число для начала в df2
в этом диапазоне.
Вот конечный результат он должен выглядеть следующим образом:
result
rank start labels
first 31333 label2
first 31434 label2
first 33039 NaN
first 33123 label4
first 33125 label4
start==31333
находится в диапазоне между 31293
до 31435
в df1
с label = label2
. Целое число 31434
также находится между диапазоном 31293:31435
, поэтому оно также аннотируется label2
. Значение 33039
не находится между интервалом в df2
, поэтому оно получает значение NaN
.
правило, с помощью которого объединены эти dataframes заключается в следующем:
(df2.start >= df1.begin) & (df2.start <= df1.end)
, но и, каждая строка должна соответствовать одинаковые значения ранга, например, каждая строка должна соответствовать первой или второй строке для этого условного выражения.
Вот код, который я использую, чтобы объединить эти два dataframes, но это не очень хорошо масштабируется на всех:
from numpy import nan
def between_range(row):
subset = df1.loc[(row["rank"] == df1.rank) & (row.start >= repeats.start) & (row.start <= repeats.end), :]
if subset.empty:
return np.nan
return subset.labels
Есть еще один способ сделать это с помощью объединения (возможно, по рангу)? Любое другое решение на основе панд?
@Kartik Я попытался упростить вопрос здесь. Спасибо за любую помощь – EB2127
@MaxU Я обновил выше. Любые идеи, как это может масштабироваться/работать? – EB2127