Панды: подсчитать количество повторяющихся строк с помощью группового - PullRequest
1 голос
/ 23 октября 2019

У меня есть фрейм данных с дублирующимися строками

>>> d = pd.DataFrame({'n': ['a', 'a', 'a'], 'v': [1,2,1]})
>>> d
   n  v
0  a  1
1  a  2
2  a  1

Я хотел бы понять, как конкретно использовать метод .groupby(), чтобы я мог добавить новый столбец в фрейм данных, который показывает количество строк, которыеидентичен текущему.

>>> dd = d.groupby(by=['n','v'], as_index=False)  # Use all columns to find groups of identical rows
>>> for k,v in dd:
...      print(k, "\n", v, "\n")  # Check what we found
... 
('a', 1) 
    n  v
0  a  1
2  a  1 

('a', 2) 
    n  v
1  a  2 

Когда я пытаюсь сделать dd.count() на результирующем DataFrameGroupBy объекте, я получаю IndexError: list index out of range. Похоже, это происходит потому, что все столбцы используются в операции группировки, и нет другого столбца для подсчета. Точно так же dd.agg({'n', 'count'}) терпит неудачу с ValueError: no results.

Я мог бы использовать .apply() для достижения чего-то похожего на результат.

>>> dd.apply(lambda x: x.assign(freq=len(x)))
     n  v  freq
0 0  a  1     2
  2  a  1     2
1 1  a  2     1

Однако это имеет две проблемы: 1) что-то происходит синдекс, так что трудно сопоставить его с исходным индексом, 2) это не кажется идиоматическим, и Панды и руководства не поощряют , используя .apply(), поскольку это может быть медленным.

IsЕсть более идиоматический способ подсчета повторяющихся строк при использовании .groupby()?

1 Ответ

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

Одним из решений является использование GroupBy.size для совокупного вывода со счетчиком:

d = d.groupby(by=['n','v']).size().reset_index(name='c')
print (d)
   n  v  c
0  a  1  2
1  a  2  1

Ваше решение работает, если указать какое-либо имя столбца после groupby, поскольку других столбцов нет n, v на входе DataFrame:

d = d.groupby(by=['n','v'])['n'].count().reset_index(name='c')

print (d)
   n  v  c
0  a  1  2
1  a  2  1

Что также необходимо, если нужен новый столбец с GroupBy.transform - новый столбец заполнен совокупными значениями:

d['c'] = d.groupby(by=['n','v'])['n'].transform('size')
print (d)
   n  v  c
0  a  1  2
1  a  2  1
2  a  1  2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...