Подтвердить что ты не робот

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

В этом разница между groupby("x").count и groupby("x").size в pandas?

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

4b9b3361

Ответ 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 

Ответ 2

Просто добавьте немного ответа @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

Ответ 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, и когда ничего не передается, панда решает не делать никаких предположений.

Ответ 4

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

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