В чем разница между размером и количеством в пандах?

88

В чем разница между groupby("x").countи groupby("x").sizeв пандах?

Размер исключает только ноль?

Донован Томсон
источник
4
В документации сказано, что размер «возвращает количество элементов в NDFrame» и count «возвращает серию с количеством ненулевых / ненулевых наблюдений по запрошенной оси. Работает также с данными без плавающей точки (обнаруживает NaN и None)»
hamsternik
В дополнение к принятому ответу в моем ответе здесь есть и другие интересные особенности .
cs95

Ответы:

101

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 
EdChum
источник
6
Я думаю, что счетчик также возвращает DataFrame при изменении размера серии?
Mr_and_Mrs_D
1
Функция .size () получает агрегированное значение только определенного столбца, в то время как .column () используется для каждого столбца.
Nachiket
@Mr_and_Mrs_D size возвращает целое число
boardtc
@boardtc df.size возвращает число - здесь обсуждаются методы groupby, см. ссылки в вопросе.
Mr_and_Mrs_D
Что касается моего вопроса - count и size действительно возвращают DataFrame и Series соответственно, когда «привязаны» к экземпляру DataFrameGroupBy - в вопросе привязаны к SeriesGroupBy, поэтому они оба возвращают экземпляр Series
Mr_and_Mrs_D
26

В чем разница между размером и количеством в пандах?

В других ответах указывается на разницу, однако не совсем точно сказать « 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 решает не делать никаких предположений.

cs95
источник
7

Просто чтобы добавить немного к ответу @ 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в пандах.
QM.py
@ QM.py НЕТ, это не так. Причина разницы в groupbyвыводе объясняется здесь .
cs95 02
1

Когда мы имеем дело с обычными фреймами данных, то единственная разница будет заключаться во включении значений NAN, что означает, что count не включает значения NAN при подсчете строк.

Но если мы используем эти функции с groupbythen, чтобы получить правильные результаты, count()мы должны связать любое числовое поле с, groupbyчтобы получить точное количество групп, для size()которых нет необходимости в этом типе ассоциации.

Мукул Танежа
источник
0

В дополнение ко всем приведенным выше ответам я хотел бы указать еще на одно различие, которое мне кажется значительным.

Вы можете соотнести Datarameразмер и количество Панды с Vectorsразмером и длиной Java . Когда мы создаем вектор, ему выделяется некоторая предопределенная память. когда мы приближаемся к количеству элементов, которое он может занимать при добавлении элементов, ему выделяется больше памяти. Точно так же, DataFrameкогда мы добавляем элементы, выделяемая им память увеличивается.

Атрибут Size указывает количество выделенных ячеек памяти, DataFrameтогда как count дает количество элементов, которые фактически присутствуют в DataFrame. Например, введите описание изображения здесь

Вы можете видеть, что в нем 3 ряда DataFrame, его размер равен 6.

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

drp
источник