pandas dataframe. сравнить значения датафреймов
У меня есть несколько датафреймов df, df_left_border, df_right_border, где
df 
df_left_border
df_right_border аналогичен left
Необходимо посчитать количество элементов df, которые больше соответствующего значения df_left.. и меньше соответствующего значения df_right.. То есть как то сравнить все значения первой строки df со значениями первой строки двух других датафреймов, все значения второй строки со значениями второй строки двух других датафреймов и тд.
Можно ли это сделать без больших затрат времени, без вложенных циклов?
Ответы (1 шт):
С помощью метода DataFrame.apply можно применять пользовательские функции к фрейму вдоль заданной оси (нас интересует сравнение значений каждого фрейма построчно, значит функцию применять мы тоже хотим построчно, в пандасе это ось 1).
Функция, переданная в apply, принимает в качестве аргумента объект pandas.Series, содержащий данные текущей строке (в случае с осью 1). Поле .name у этого Series содержит индекс текущей строки, по этому индексу мы можем получить соответствующие верхнюю и нижнюю границы из df_left и df_right, а затем сравнить значения массива в текущей строке df с этими границами. В случае если значения-массивы в df это numpy.ndarray, то код применяемой к фрейму функции может быть следующим:
def fn(row):
current_row_index = row.name
current_row_values = row["BODY_AVG_VALUE"]
lower_bound = df_left_border.loc[current_row_index, "BODY_AVG_VALUE"]
upper_bound = df_right_border.loc[current_row_index, "BODY_AVG_VALUE"]
satisfy_lower_bound = current_row_values >= lower_bound
satisfy_upper_bound = current_row_values <= upper_bound
return np.logical_and(satisfy_lower_bound, satisfy_upper_bound).sum()
result = df.apply(fn, axis=1)
Если тип массивов в df неизвестен, то можно заменить последние 3 строчки fn на более общий случий:
return len(
[val for val in current_row_values if val >= lower_bound and val <= upper_bound]
)
