Панды выбирают строки, корень которых насчитывается 3 раза - PullRequest
1 голос
/ 18 октября 2019

Вот пример:

df = pd.DataFrame({
    'file':['f1','f2','f3','f4','f5','f6','f7','f8','f9','f10','f11','f12'],
    'root':['root1','root1','root1','root2','root2','root2','root3','root4','root5','root6','root6','root6'],
})

Мне нужен вывод, подобный следующему:

    file    root
0   f1  root1
1   f2  root1
2   f3  root1
3   f4  root2
4   f5  root2
5   f6  root2
9   f10 root6
10  f11 root6
11  f12 root6

Поскольку root1 / root2 / root3 учитываются 3 раза в столбце

Ответы [ 3 ]

3 голосов
/ 18 октября 2019

filter

API для этого метода filter объекта groupby.
см. Также Split-Apply-Combine

df.groupby('root').filter(lambda x: x.size > 2)

   file   root
0    f1  root1
1    f2  root1
2    f3  root1
3    f4  root2
4    f5  root2
5    f6  root2
9   f10  root6
10  f11  root6
11  f12  root6

Передать вызываемый элемент в filter, который принимает в качестве аргумента фрейм данных и возвращает логическое значение. groupby затем возвращает только те группы, в которые вернулся вызываемый элемент True

2 голосов
/ 18 октября 2019

Вы можете использовать transform('count') на groupby:

df[df.groupby('root')['file'].transform('count').eq(3)]

Выход:

   file   root
0    f1  root1
1    f2  root1
2    f3  root1
3    f4  root2
4    f5  root2
5    f6  root2
9   f10  root6
10  f11  root6
11  f12  root6
1 голос
/ 18 октября 2019

Вы можете сделать:

mask = (df.groupby('root').transform('count').eq(3)).squeeze()
print(df[mask])

Выход

   file   root
0    f1  root1
1    f2  root1
2    f3  root1
3    f4  root2
4    f5  root2
5    f6  root2
9   f10  root6
10  f11  root6
11  f12  root6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...