В этом разница между groupby("x").count
и groupby("x").size
в pandas?
Размер просто исключает ноль?
В этом разница между groupby("x").count
и groupby("x").size
в pandas?
Размер просто исключает ноль?
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, даже если данные не имеют значений 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
учитывает 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
, и когда ничего не передается, панда решает не делать никаких предположений.
Когда мы имеем дело с обычными фреймами данных, то единственной разницей будет включение значений NAN, что означает, что count не включает значения NAN при подсчете строк.
Но если мы используем эти функции с groupby
то для получения правильных результатов с помощью count()
мы должны связать любое числовое поле с groupby
чтобы получить точное число групп, где для size()
нет необходимости в этом типе. ассоциации.