Яка різниця між розміром і кількістю в пандах?


87

У чому різниця між пандами groupby("x").countта groupby("x").sizeв них?

Чи розмір просто не виключає нуль?


4
У документації сказано, що розмір "повертає кількість елементів у NDFrame" і підраховує "повертає ряд із кількістю спостережень, що не відповідають NA / null, над запитуваною віссю. Працює також із даними з не плаваючою точкою (виявляє NaN та None)"
hamsternik

На додаток до прийнятої відповіді, є ще кілька цікавих відмінностей, виділених у моїй відповіді тут .
cs95

Відповіді:


99

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 

6
Я думаю, що count також повертає DataFrame, тоді як розмір серії?
Mr_and_Mrs_D

1
Функція .size () отримує агреговане значення конкретного стовпця лише тоді, коли .column () використовується для кожного стовпця.
Nachiket

@Mr_and_Mrs_D size повертає ціле число
boardtc

@boardtc df.size повертає число - тут обговорюються методи groupby, див. посилання у питанні.
Mr_and_Mrs_D

Що стосується мого запитання - кількість і розмір дійсно повертають DataFrame та Series відповідно, коли "прив'язані" до екземпляра DataFrameGroupBy - у питанні прив'язані до SeriesGroupBy, тому вони обидва повертають екземпляр Series
Mr_and_Mrs_D

25

Яка різниця між розміром і кількістю в пандах?

Інші відповіді вказують на різницю, однак, не зовсім точно сказати " 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аргументу, а коли нічого не передано, панди вирішують не робити припущень.


7

Просто щоб додати трохи до відповіді @ 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панд.
QM.py

@ QM.py НІ, це не так. Причина різниці в groupbyвиході пояснюється тут .
cs95,

1

Коли ми маємо справу з нормальними кадрами даних, тоді лише різницею буде включення значень NAN, означає, що count не включає значення NAN під час підрахунку рядків.

Але якщо ми використовуємо ці функції з groupbyтоді, для отримання правильних результатів count()ми повинні пов'язати будь-яке числове поле з, groupbyщоб отримати точну кількість груп, де size()немає необхідності в цьому типі асоціації.


0

На додаток до всіх вищезазначених відповідей, я хотів би вказати ще на одну різницю, яка видається мені суттєвою.

Ви можете співвіднести Datarameрозмір і підрахунок панди з Vectorsрозміром і довжиною Java . Коли ми створюємо вектор, йому виділяється деяка заздалегідь визначена пам'ять. коли ми підходимо ближче до кількості елементів, яку вона може зайняти при додаванні елементів, їй виділяється більше пам'яті. Подібно до того, DataFrameяк ми додаємо елементи, виділяється йому пам’ять збільшується.

Атрибут size дає кількість виділеної комірки пам'яті, DataFrameтоді як count - кількість елементів, які насправді присутні DataFrame. Наприклад, введіть тут опис зображення

Ви можете бачити, що там є 3 рядки DataFrame, його розмір - 6.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.