Фильтрация по количеству логических вхождений на группу в кадре данных - PullRequest
0 голосов
/ 11 сентября 2018

Я имею дело с Dataframe, содержащим столбец с логическими данными. Это выглядит следующим образом:

       A  match
52     7   True
53     7   True
54     7   False
55     7   False
56     7   False
57     7   False
437    8   True
438    8   True
439    8   True
440    8   True
441    8   True
442    8   False
488    2   False
489    2   True
490    2   True

Мне нужно удалить те строки, которые содержат более 2 ложных значений в столбце 'match', все по ссылке на столбец A. Вывод будет:

       A  match
437    8   True
438    8   True
439    8   True
440    8   True
441    8   True
442    8   False
488    2   False
489    2   True
490    2   True

Я пытаюсь сгруппировать столбец A, а затем посчитать количество ложных, но я застрял здесь. Некоторые идеи?

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Использование filter

In [175]: df.groupby('A').filter(lambda x: (~x.match).sum()<2)
Out[175]:
     A  match
437  8   True
438  8   True
439  8   True
440  8   True
441  8   True
442  8  False
488  2  False
489  2   True
490  2   True
0 голосов
/ 11 сентября 2018

Использование isin с groupby sum

s=(~df['match']).groupby(df['A']).sum()<2
df.loc[df.A.isin(s[s].index)]
Out[92]: 
     A  match
437  8   True
438  8   True
439  8   True
440  8   True
441  8   True
442  8  False
488  2  False
489  2   True
490  2   True
0 голосов
/ 11 сентября 2018

Отрицайте столбец, groupby A и используйте transform:

s= (~df.match).groupby(df.A).transform('sum')

Следующее использование loc для выбора желаемых значений:

df.loc[s.le(2)]

     A  match 
437  8   True 
438  8   True 
439  8   True 
440  8   True 
441  8   True 
442  8  False 
488  2  False 
489  2   True 
490  2   True 

В одну строку:

df.loc[(~df.match).groupby(df.A).transform('sum').le(2)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...