Узнайте, находятся ли значения в фрейме данных между значениями в другом фрейме данных

#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