#python #pandas #dataframe
Вопрос:
Я новичок в pandas и пытаюсь понять, есть ли способ выяснить, находятся ли два значения из одной строки в df1 между двумя значениями из одной строки в df2.
В основном мой df1 выглядит так:
start | value | end
1 | TEST | 5
2 | TEST | 3
...
и мой df2 выглядит так:
start | value | end
2 | TEST2 | 10
3 | TEST2 | 4
...
Прямо сейчас я работаю с двумя циклами:
for row in df1.iterrows():
for row2 in df2.iterrows():
if row2[1]["start"] >= row[1]["start"] and row2[1]["end"] <= row[1]["end"]:
print(row2)
но мне не кажется, что это путь pandas.
Я ожидаю, что номер строки 2 из df2 будет напечатан, потому что 3> 1 и 4 < 5, т.Е.:
3 | TEST2 | 4
Есть ли способ сделать это в режиме работы pandas?
Ответ №1:
Вы можете использовать крест merge
, чтобы получить все комбинации df1
и df2
строк, и фильтровать с использованием классических сравнений. Наконец, получите индексы и срез:
idx = (df1.merge(df2.reset_index(), suffixes=('1', '2'), how='cross')
.query('(start2 > start1) amp; (end2 < end1)')
['index'].unique()
)
df2.loc[idx]
ПРИМЕЧАНИЕ. Я использую unique
здесь, чтобы гарантировать, что строка выбирается только один раз, даже если есть несколько совпадений
вывод:
start value end
1 3 TEST2 4