У чому різниця між пандами 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повертає серію.
Причина в тому, що 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аргументу, а коли нічого не передано, панди вирішують не робити припущень.
Просто щоб додати трохи до відповіді @ 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тоді, для отримання правильних результатів count()ми повинні пов'язати будь-яке числове поле з, groupbyщоб отримати точну кількість груп, де size()немає необхідності в цьому типі асоціації.
На додаток до всіх вищезазначених відповідей, я хотів би вказати ще на одну різницю, яка видається мені суттєвою.
Ви можете співвіднести Datarameрозмір і підрахунок панди з Vectorsрозміром і довжиною Java . Коли ми створюємо вектор, йому виділяється деяка заздалегідь визначена пам'ять. коли ми підходимо ближче до кількості елементів, яку вона може зайняти при додаванні елементів, їй виділяється більше пам'яті. Подібно до того, DataFrameяк ми додаємо елементи, виділяється йому пам’ять збільшується.
Атрибут size дає кількість виділеної комірки пам'яті, DataFrameтоді як count - кількість елементів, які насправді присутні DataFrame. Наприклад,

Ви можете бачити, що там є 3 рядки DataFrame, його розмір - 6.
Ця відповідь охоплює розмір і різницю в підрахунку щодо DataFrameі ні Pandas Series. Я не перевіряв, що відбуваєтьсяSeries