как добавить pd.groupby (). size () в data.frame? [Дубликат]

Мне кажется, что нарезка - это не столько проблема, которая отличается от того, когда ваши собственные классы и программы плохо архивируются / разработаны.

Если я передаю объект подкласса в качестве параметра для метод, который принимает параметр суперкласса типа, я должен, конечно, знать об этом и знать внутренне, вызываемый метод будет работать только с объектом суперкласса (aka baseclass).

Мне кажется, необоснованное ожидание того, что предоставление подкласса, где запрашивается базовый класс, каким-то образом приведет к конкретным результатам подкласса, вызовет проблему разрезания. Его либо плохой дизайн при использовании метода, либо недостаточная реализация подкласса. Я предполагаю, что это обычно результат жертвовать хорошим дизайном ООП в пользу целесообразности или повышения производительности.

25
задан d1337 1 August 2013 в 14:11
поделиться

4 ответа

Результат df.groupby(...) не является DataFrame. Чтобы вернуть DataFrame, вам нужно применить функцию к каждой группе, преобразовать каждый элемент группы или фильтровать группы.

Кажется, что вам нужен DataFrame, содержащий (1) все ваши оригинальные данные в df и (2) подсчет количества данных в каждой группе. Эти вещи имеют разную длину, поэтому, если им нужно зайти в один и тот же DataFrame, вам нужно будет перечислять размер избыточно, т. Е. Для каждой строки в каждой группе.

df['size'] = df.groupby(['A','B']).transform(np.size)

(Кроме этого: это полезно, если вы можете показать сжатый ввод проб и ожидаемые результаты.)

18
ответ дан Dan Allan 21 August 2018 в 07:23
поделиться
  • 1
    yay, преобразуйте! – Andy Hayden 1 August 2013 в 14:19
  • 2
    Я также нашел это почти равным (создает новый фреймворк), но не уверен, как он сравнивается с вашим решением с точки зрения эффективности stackoverflow.com/questions/10373660/… – d1337 2 August 2013 в 02:22
  • 3
    Более того, ваше решение хорошо работает на примере игрушек, но по фактическим данным возвращается ошибка pastebin.com/aCsMxCd5 – d1337 2 August 2013 в 10:57
  • 4
    В пандах 20.3 работает @ jezraels df['size'] = df.groupby(['A','B']) .A .transform(np.size); без .A вы получаете & quot; ValueError: неправильное количество элементов, переданных 2, размещение подразумевает 1 & quot ;, т. е. получает 2 столбца, необходимо 1 & quot; , – denis 14 July 2017 в 16:35

Вам нужно transform size - len of df такое же, как и раньше:

import pandas as pd

df = pd.DataFrame({'A': ['x', 'x', 'x','y','y']
                , 'B': ['a', 'c', 'c','b','b']})
print (df)
   A  B
0  x  a
1  x  c
2  x  c
3  y  b
4  y  b

df['size'] = df.groupby(['A', 'B'])['A'].transform('size')
print (df)
   A  B  size
0  x  a     1
1  x  c     2
2  x  c     2
3  y  b     2
4  y  b     2

При необходимости имя столбца в агрегации df - len of df, очевидно, НЕ такое же, как и раньше:

import pandas as pd

df = pd.DataFrame({'A': ['x', 'x', 'x','y','y']
                , 'B': ['a', 'c', 'c','b','b']})
print (df)
   A  B
0  x  a
1  x  c
2  x  c
3  y  b
4  y  b

df = df.groupby(['A', 'B']).size().reset_index(name='Size')
print (df)
   A  B  Size
0  x  a     1
1  x  c     2
2  y  b     2
11
ответ дан jezrael 21 August 2018 в 07:23
поделиться
  • 1
    Хороший. Но как мне сделать то же самое, что и df.groupby(['A', 'B']).size().reset_index(name='Size') Если у меня есть несколько индексов? – Sotos 26 April 2018 в 12:20
  • 2
  • 3
    так что-то вроде ...reset_index('V1', name = 'size')? – Sotos 26 April 2018 в 12:38
  • 4
    @Sotos Хммм, это не работает. Необходимость .reset_index().rename(columns='index':'col', 'anothercol':'col2') – jezrael 26 April 2018 в 13:41
  • 5
    Именно это я и сделал в конце ... (full_df .set_index('cdatetime') .groupby(['Cluster', 'source', 'action', pd.Grouper(freq = 'H', sort = True)]) .size() .reset_index(['Cluster', 'source', 'action']) .rename(columns={0: 'cnt'}) ) – Sotos 26 April 2018 в 13:44
0
ответ дан Kallol 21 August 2018 в 07:23
поделиться

Встроенный метод объектов .size() объектов DataFrameGroupBy фактически возвращает объект Series с размерами группы, а не DataFrame. Если вы хотите, чтобы DataFrame, чей столбец был размером группы, индексированный группами, с настраиваемым именем, вы можете использовать метод .to_frame() и использовать в качестве аргумента имя требуемого столбца.

grpd = df.groupby(['A','B']).size().to_frame('size')

Если вы хотите, чтобы группы были столбцами снова, вы могли бы добавить .reset_index() в конец.

23
ответ дан Sealander 21 August 2018 в 07:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: