В чем разница между 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 при подсчете строк.
Но если мы используем эти функции с groupby
then, чтобы получить правильные результаты, count()
мы должны связать любое числовое поле с, groupby
чтобы получить точное количество групп, для size()
которых нет необходимости в этом типе ассоциации.
В дополнение ко всем приведенным выше ответам я хотел бы указать еще на одно различие, которое мне кажется значительным.
Вы можете соотнести Datarame
размер и количество Панды с Vectors
размером и длиной Java . Когда мы создаем вектор, ему выделяется некоторая предопределенная память. когда мы приближаемся к количеству элементов, которое он может занимать при добавлении элементов, ему выделяется больше памяти. Точно так же, DataFrame
когда мы добавляем элементы, выделяемая им память увеличивается.
Атрибут Size указывает количество выделенных ячеек памяти, DataFrame
тогда как count дает количество элементов, которые фактически присутствуют в DataFrame
. Например,
Вы можете видеть, что в нем 3 ряда DataFrame
, его размер равен 6.
Этот ответ касается разницы в размере и подсчете относительно, DataFrame
а не Pandas Series
. Я не проверял, что происходит сSeries