Быстро применить несколько фильтров к pandas фрейму данных - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь отфильтровать этот фрейм данных:

     ID  fallowDeer     woodland       fox         rabbits
     1         0.0     4.056649      2.210927      31.150451
     2         0.0     2.267544      1.380185      38.631221
     3         0.0     5.602904      1.201781      4.124286
     4         0.0     7.377308      7.834358      25.911328
     5         0.0     2.129115      1.564075      3.931565
     6         0.0     5.988451      1.699852      32.915730
     7         0.0     1.427553      3.586585      7.444735
     8         0.0     9.857577      8.709137      34.004470
     9         0.0     7.468365      1.317117      38.440278
    10         0.0     3.902134      4.112038      22.427969

Чтобы сохранить только те строки, где каждый вид находится между минимальным и максимальным значениями, показанными ниже (это ряды):

Минимальные значения

fallowDeer        0
woodland          1
fox               3
rabbits           10

Максимальные значения

fallowDeer        0
woodland          4
fox               6
rabbits           20

Этот код работает:

accepted_simulations = df[(df['fallowDeer'] <= max_values['fallowDeer']) & (df['fallowDeer'] >= min_values['fallowDeer']) & (df['woodland'] <= max_values['woodland']) & (df['woodland'] >= min_values['woodland']) & (df['fox'] <= max_values['fox']) & (df['fox'] >= min_values['fox']) & (df['rabbits'] <= max_values['rabbits']) & (df['rabbits'] >= min_values['rabbits'])]

Однако я собираюсь добавить еще много видов / столбцов в будущем и хотел бы избежать необходимости вручную проверять каждый вид на минимальное / максимальное значение, как я сделал здесь. Есть ли способ быстро сравнить каждый вид с минимальным / максимальным значением и отфильтровать фрейм данных без необходимости вручную проверять каждый из них?

1 Ответ

0 голосов
/ 16 июня 2020

Вы можете сравнить все столбцы вместе, если min_values и max_values равны Series с Index.intersection для получения имен столбцов по индексу минимальных и максимальных значений и сравнения по DataFrame.le и DataFrame.ge:

c1 = df.columns.intersection(min_values.index)
m1 = df[c1].ge(min_values.loc[c1])
print (m1)
   fallowDeer  woodland    fox  rabbits
0        True      True  False     True
1        True     False  False     True
2        True      True  False    False
3        True      True   True     True
4        True     False  False    False
5        True      True  False     True
6        True     False  False    False
7        True      True   True     True
8        True      True  False     True
9        True     False  False     True

c2 = df.columns.intersection(max_values.index)
m2 = df[c2].le(max_values.loc[c2])
print (m2)
   fallowDeer  woodland    fox  rabbits
0        True     False   True    False
1        True     False   True    False
2        True     False   True     True
3        True     False  False    False
4        True     False   True     True
5        True     False   True    False
6        True     False  False     True
7        True     False  False    False
8        True     False   True    False
9        True     False  False    False

Тогда возможно объединить обе маски в цепочку:

m = m1 & m2
print (m)
   fallowDeer  woodland    fox  rabbits
0        True     False  False    False
1        True     False  False    False
2        True     False  False    False
3        True     False  False    False
4        True     False  False    False
5        True     False  False    False
6        True     False  False    False
7        True     False  False    False
8        True     False  False    False
9        True     False  False    False

Последняя для фильтрации, если True всего строки маски используют DataFrame.all:

accepted_simulations  = df[m.all(axis=1)]
print (accepted_simulations)

Empty DataFrame
Columns: [ID, fallowDeer, woodland, fox, rabbits]
Index: []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...