У чому різниця між пандами 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