Как фильтровать значения из фрейма данных Pandas с несколькими индексами

#python-3.x #pandas

#python-3.x #pandas

Вопрос:

У меня есть фрейм данных pandas с несколькими индексами df , как показано ниже:

                 Count
Letter Direction           
A       -1          3
         1          0
B       -1          2
         1          4
C       -1          4
         1          10
D       -1          8
         1          1
E       -1          4
         1          5
F       -1          1
         1          1 
  

Я хочу отфильтровать Letters то, что имеет Count < 2 оба или одно из направлений.
Пробовал df[df.Count < 2] , но он выдает следующий результат:

                 Count
Letter Direction           
A        1          0
D        1          1
F       -1          1
         1          1
  

Желаемый результат выглядит следующим образом,

                 Count
Letter Direction           
A       -1          3
         1          0
D       -1          8
         1          1
F       -1          1
         1          1
  

что я должен сделать, чтобы получить вышеуказанное?

Ответ №1:

Используйте GroupBy.transform с логической маской и GroupBy.any any проверьте, есть ли хотя бы один True на первый уровень MultiIndex и transform возвращает mask тот же размер, что и исходный фрейм данных, поэтому возможен фильтр по boolean indexing :

 df = df[(df.Count < 2).groupby(level=0).transform('any')]
print (df)
                  Count
Letter Direction       
A      -1             3
        1             0
D      -1             8
        1             1
F      -1             1
        1             1
  

Другим решением является использование MultiIndex.get_level_values для получения значений Letter по условию и выбора по DataFrame.loc :

 df = df.loc[df.index.get_level_values(0)[df.Count < 2]]
print (df)
                  Count
Letter Direction       
A      -1             3
        1             0
D      -1             8
        1             1
F      -1             1
        1             1