Sự khác biệt giữa kích thước và số lượng ở gấu trúc là gì?


87

Đó là sự khác biệt giữa groupby("x").countgroupby("x").sizeở gấu trúc?

Kích thước có loại trừ nil không?


4
Tài liệu cho biết, kích thước đó "trả về số phần tử trong NDFrame" và đếm "Chuỗi trả về với số quan sát không phải NA / null trên trục được yêu cầu. Hoạt động với cả dữ liệu không phải dấu chấm động (phát hiện NaN và Không có)"
hamsternik

Ngoài câu trả lời được chấp nhận, có một số điểm khác biệt thú vị khác được nêu rõ trong câu trả lời của tôi ở đây .
cs95

Câu trả lời:


99

sizebao gồm NaNcác giá trị, countkhông:

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
Tôi nghĩ rằng số lượng đó cũng trả về một DataFrame trong khi kích thước một Chuỗi?
Mr_and_Mrs_D

1
Hàm .size () chỉ nhận giá trị tổng hợp của cột cụ thể trong khi .column () được sử dụng cho mọi cột.
Nachiket

Kích thước @Mr_and_Mrs_D trả về một số nguyên
boardtc

@boardtc df.size trả về một số - các phương pháp theo nhóm được thảo luận ở đây, hãy xem các liên kết trong câu hỏi.
Mr_and_Mrs_D

Đối với câu hỏi của tôi - số lượng và kích thước thực sự trả về DataFrame và Series tương ứng khi "bị ràng buộc" với phiên bản DataFrameGroupBy - trong câu hỏi được liên kết với SeriesGroupBy vì vậy cả hai đều trả về phiên bản Series
Mr_and_Mrs_D

25

Sự khác biệt giữa kích thước và số lượng ở gấu trúc là gì?

Các câu trả lời khác đã chỉ ra sự khác biệt, tuy nhiên, không hoàn toàn chính xác khi nói " sizeđếm NaN trong khi countkhông tính". Mặc dù sizethực sự không đếm NaN, đây thực sự là hệ quả của việc sizetrả về kích thước (hoặc chiều dài) của đối tượng mà nó được gọi. Đương nhiên, điều này cũng bao gồm các hàng / giá trị là NaN.

Vì vậy, để tóm tắt, sizetrả về kích thước của 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

... trong khi countđếm các giá trị không phải NaN:

df.A.count()
# 3 

Lưu ý rằng đó sizelà một thuộc tính (cho kết quả giống như len(df)hoặc len(df.A)). countlà một chức năng.

1. DataFrame.sizecũng là một thuộc tính và trả về số phần tử trong DataFrame (hàng x cột).


Hành vi với GroupBy- Cấu trúc đầu ra

Bên cạnh đó là sự khác biệt cơ bản, cũng có sự khác biệt trong cấu trúc của sản lượng được tạo ra khi gọi GroupBy.size()vs 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

Xem xét,

df.groupby('A').size()

A
a    3
b    2
c    3
dtype: int64

Đấu với,

df.groupby('A').count()

   B
A   
a  2
b  0
c  2

GroupBy.counttrả về DataFrame khi bạn gọi counttrên tất cả cột, trong khi GroupBy.sizetrả về Chuỗi.

Lý do sizelà tất cả các cột đều giống nhau, vì vậy chỉ một kết quả duy nhất được trả về. Trong khi đó, giá trị countđược gọi cho mỗi cột, vì kết quả sẽ phụ thuộc vào số lượng NaN mỗi cột có.


Hành vi với pivot_table

Một ví dụ khác là cách pivot_tablexử lý dữ liệu này. Giả sử chúng ta muốn tính toán lập bảng chéo của

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

Với pivot_table, bạn có thể phát hành 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

Nhưng countkhông hoạt động; một DataFrame trống được trả về:

df.pivot_table(index='A', columns='B', aggfunc='count')

Empty DataFrame
Columns: []
Index: [0, 1]

Tôi tin rằng lý do của điều này là nó 'count'phải được thực hiện trên chuỗi được chuyển đến valuesđối số, và khi không có gì được thông qua, gấu trúc quyết định không đưa ra giả định nào.


7

Chỉ cần thêm một chút vào câu trả lời của @ Edchum, ngay cả khi dữ liệu không có giá trị NA, kết quả của count () dài dòng hơn, sử dụng ví dụ trước:

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

Nó có vẻ sizethanh lịch tương đương với countgấu trúc.
QM.py

@ QM.py KHÔNG, không phải vậy. Lý do cho sự khác biệt trong groupbysản lượng được giải thích ở đây .
cs95

1

Khi chúng ta xử lý các khung dữ liệu thông thường thì chỉ có sự khác biệt là bao gồm các giá trị NAN, có nghĩa là số đếm không bao gồm các giá trị NAN trong khi đếm hàng.

Nhưng nếu chúng ta đang sử dụng các hàm này với groupbythì, để có được kết quả chính xác, count()chúng ta phải liên kết bất kỳ trường số nào với trường groupbyđể có được số nhóm chính xác mà size()không cần loại liên kết này.


0

Ngoài tất cả các câu trả lời trên, tôi muốn chỉ ra một điểm khác biệt nữa mà tôi có vẻ quan trọng.

Bạn có thể tương quan với Panda's Datarame kích thước và số lượng với Vectorskích thước và chiều dài của Java . Khi chúng ta tạo vector, một số bộ nhớ được xác định trước sẽ được cấp cho nó. khi chúng ta tiếp cận gần hơn số phần tử mà nó có thể chiếm trong khi thêm phần tử, nhiều bộ nhớ hơn được cấp cho nó. Tương tự, DataFramekhi chúng ta thêm các phần tử, bộ nhớ được cấp cho nó sẽ tăng lên.

Thuộc tính size cho biết số ô nhớ được cấp phát DataFrametrong khi count cho biết số phần tử thực sự có trongDataFrame . Ví dụ, nhập mô tả hình ảnh ở đây

Bạn có thể thấy mặc dù có 3 hàng DataFrame, nhưng kích thước của nó là 6.

Câu trả lời này bao gồm sự khác biệt về kích thước và số lượng đối với DataFramevà không Pandas Series. Tôi chưa kiểm tra điều gì xảy ra vớiSeries

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.