Мне кажется, что нарезка - это не столько проблема, которая отличается от того, когда ваши собственные классы и программы плохо архивируются / разработаны.
Если я передаю объект подкласса в качестве параметра для метод, который принимает параметр суперкласса типа, я должен, конечно, знать об этом и знать внутренне, вызываемый метод будет работать только с объектом суперкласса (aka baseclass).
Мне кажется, необоснованное ожидание того, что предоставление подкласса, где запрашивается базовый класс, каким-то образом приведет к конкретным результатам подкласса, вызовет проблему разрезания. Его либо плохой дизайн при использовании метода, либо недостаточная реализация подкласса. Я предполагаю, что это обычно результат жертвовать хорошим дизайном ООП в пользу целесообразности или повышения производительности.
Результат df.groupby(...)
не является DataFrame. Чтобы вернуть DataFrame, вам нужно применить функцию к каждой группе, преобразовать каждый элемент группы или фильтровать группы.
Кажется, что вам нужен DataFrame, содержащий (1) все ваши оригинальные данные в df
и (2) подсчет количества данных в каждой группе. Эти вещи имеют разную длину, поэтому, если им нужно зайти в один и тот же DataFrame, вам нужно будет перечислять размер избыточно, т. Е. Для каждой строки в каждой группе.
df['size'] = df.groupby(['A','B']).transform(np.size)
(Кроме этого: это полезно, если вы можете показать сжатый ввод проб и ожидаемые результаты.)
Вам нужно 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
df.groupby(['A', 'B']).size().reset_index(name='Size')
Если у меня есть несколько индексов?
– Sotos
26 April 2018 в 12:20
.reset_index().rename(columns='index':'col', 'anothercol':'col2')
– jezrael
26 April 2018 в 13:41
(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
Встроенный метод объектов .size()
объектов DataFrameGroupBy фактически возвращает объект Series с размерами группы, а не DataFrame. Если вы хотите, чтобы DataFrame, чей столбец был размером группы, индексированный группами, с настраиваемым именем, вы можете использовать метод .to_frame()
и использовать в качестве аргумента имя требуемого столбца.
grpd = df.groupby(['A','B']).size().to_frame('size')
Если вы хотите, чтобы группы были столбцами снова, вы могли бы добавить .reset_index()
в конец.
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