#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