В чем разница между groupby("x").countи groupby("x").sizeв пандах?
Размер исключает только ноль?
В чем разница между groupby("x").countи groupby("x").sizeв пандах?
Размер исключает только ноль?
Ответы:
sizeвключает NaNзначения, countне включает :
In [46]:
df = pd.DataFrame({'a':[0,0,1,2,2,2], 'b':[1,2,3,4,np.NaN,4], 'c':np.random.randn(6)})
df
Out[46]:
a b c
0 0 1 1.067627
1 0 2 0.554691
2 1 3 0.458084
3 2 4 0.426635
4 2 NaN -2.238091
5 2 4 1.256943
In [48]:
print(df.groupby(['a'])['b'].count())
print(df.groupby(['a'])['b'].size())
a
0 2
1 1
2 2
Name: b, dtype: int64
a
0 2
1 1
2 3
dtype: int64
В чем разница между размером и количеством в пандах?
В других ответах указывается на разницу, однако не совсем точно сказать « sizeподсчитывает NaN, а countне - нет». Хотя sizeдействительно подсчитывает NaN, на самом деле это является следствием того факта, что он sizeвозвращает размер (или длину) объекта, для которого он вызван. Естественно, это также включает строки / значения, которые являются NaN.
Итак, чтобы подвести итог, sizeвозвращает размер Series / DataFrame 1 ,
df = pd.DataFrame({'A': ['x', 'y', np.nan, 'z']})
df
A
0 x
1 y
2 NaN
3 z
df.A.size
# 4
... пока countсчитает значения, отличные от NaN:
df.A.count()
# 3
Обратите внимание, что sizeэто атрибут (дает тот же результат, что и len(df)или len(df.A)). countэто функция.
1. DataFrame.sizeтакже является атрибутом и возвращает количество элементов в DataFrame (строки x столбцы).
GroupBy- Структура выводаПомимо принципиальной разницы, есть также разница в структуре сгенерированного при звонках GroupBy.size()против GroupBy.count().
df = pd.DataFrame({'A': list('aaabbccc'), 'B': ['x', 'x', np.nan, np.nan, np.nan, np.nan, 'x', 'x']})
df
A B
0 a x
1 a x
2 a NaN
3 b NaN
4 b NaN
5 c NaN
6 c x
7 c x
Рассмотреть возможность,
df.groupby('A').size()
A
a 3
b 2
c 3
dtype: int64
Против,
df.groupby('A').count()
B
A
a 2
b 0
c 2
GroupBy.countвозвращает DataFrame при вызове countвсех столбцов, а GroupBy.sizeвозвращает Series.
Причина в том, что sizeона одинакова для всех столбцов, поэтому возвращается только один результат. Между тем, countвызывается для каждого столбца, поскольку результаты будут зависеть от количества NaN в каждом столбце.
pivot_tableДругой пример - как pivot_tableобрабатываются эти данные. Предположим, мы хотели бы вычислить перекрестную таблицу
df
A B
0 0 1
1 0 1
2 1 2
3 0 2
4 0 0
pd.crosstab(df.A, df.B) # Result we expect, but with `pivot_table`.
B 0 1 2
A
0 1 2 1
1 0 0 1
С помощью pivot_tableможно выдать size:
df.pivot_table(index='A', columns='B', aggfunc='size', fill_value=0)
B 0 1 2
A
0 1 2 1
1 0 0 1
Но countне работает; возвращается пустой DataFrame:
df.pivot_table(index='A', columns='B', aggfunc='count')
Empty DataFrame
Columns: []
Index: [0, 1]
Я считаю, что причина этого в том, что это 'count'должно быть сделано для серии, которая передается valuesаргументу, и когда ничего не передается, pandas решает не делать никаких предположений.
Просто чтобы добавить немного к ответу @ Edchum, даже если данные не имеют значений NA, результат count () более подробный, используя предыдущий пример:
grouped = df.groupby('a')
grouped.count()
Out[197]:
b c
a
0 2 2
1 1 1
2 2 3
grouped.size()
Out[198]:
a
0 2
1 1
2 3
dtype: int64
sizeэлегантный аналог countв пандах.
Когда мы имеем дело с обычными фреймами данных, то единственная разница будет заключаться во включении значений NAN, что означает, что count не включает значения NAN при подсчете строк.
Но если мы используем эти функции с groupbythen, чтобы получить правильные результаты, count()мы должны связать любое числовое поле с, groupbyчтобы получить точное количество групп, для size()которых нет необходимости в этом типе ассоциации.
В дополнение ко всем приведенным выше ответам я хотел бы указать еще на одно различие, которое мне кажется значительным.
Вы можете соотнести Datarameразмер и количество Панды с Vectorsразмером и длиной Java . Когда мы создаем вектор, ему выделяется некоторая предопределенная память. когда мы приближаемся к количеству элементов, которое он может занимать при добавлении элементов, ему выделяется больше памяти. Точно так же, DataFrameкогда мы добавляем элементы, выделяемая им память увеличивается.
Атрибут Size указывает количество выделенных ячеек памяти, DataFrameтогда как count дает количество элементов, которые фактически присутствуют в DataFrame. Например,

Вы можете видеть, что в нем 3 ряда DataFrame, его размер равен 6.
Этот ответ касается разницы в размере и подсчете относительно, DataFrameа не Pandas Series. Я не проверял, что происходит сSeries