Я хочу ограничить df1 в соответствии с верхним пределом и нижним пределом, указанными в df2, с одним дополнительным условием

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть два фрейма данных df1 и df2. Я хочу, чтобы выходные данные находились в диапазоне df2 с одним дополнительным условием. df1

    Value1   con1  col1
0    35    3     App1
1    30    1     App1
2    23    1     App1
3    11    3     App1
4    29    0     App1
5    13    0     App2
6    13    1     App2
7    27    0     App2
8    14    0     App2
9    10    1     App2
  

df2

        col1  L_limit  U_limit  condition
0      App1        20     30    1
1      App2        10    15     0
  

Требуется df

    Value1   con1  col1

1    30    1     App1
2    23    1     App1
3    13    0     App2
4    14    0     App2
  

Комментарии:

1. Когда вы говорите «диапазон», что это такое, я не вижу никакого числового диапазона. можете ли вы объяснить, как вы получили требуемый фрейм данных

2. Я имею в виду диапазон как L_limit и U_limit, определенные в df2

Ответ №1:

Используйте DataFrame.merge с фильтром по DataFrame.query :

 df = (df1.merge(df2.rename(columns={'condition':'con1'}), 
               on=['col1','con1'])
       .query("L_limit <= Value1 <= U_limit")
       .drop(['L_limit','U_limit'], axis=1))
print (df)
   Value1  con1  col1
0      30     1  App1
1      23     1  App1
2      13     0  App2
4      14     0  App2
  

РЕДАКТИРОВАТЬ: вместо этого query возможно использование DataFrame.loc с boolean indexing :

 df = df1.merge(df2.rename(columns={'condition':'con1'}), on=['col1','con1'])
     
df = df.loc[df["Value1"].between(df["L_limit"], df["U_limit"]), ['Value1','con1','col1']]
print (df)
   Value1  con1  col1
0      30     1  App1
1      23     1  App1
2      13     0  App2
4      14     0  App2
  

Комментарии:

1. Спасибо за ваш ответ. Есть ли какой-либо другой способ без использования DataFrame. запрос?