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