Làm cách nào để tôi có được số lượng hàng của DataFrame gấu trúc?
Bảng này tóm tắt các tình huống khác nhau trong đó bạn muốn tính một cái gì đó trong DataFrame (hoặc Sê-ri, để hoàn thiện), cùng với (các) phương thức được đề xuất.
Chú thích
DataFrame.count
trả về số lượng cho mỗi cột Series
vì số lượng khác không thay đổi theo cột.
DataFrameGroupBy.size
trả về a Series
, vì tất cả các cột trong cùng một nhóm chia sẻ cùng một số đếm hàng.
DataFrameGroupBy.count
trả về a DataFrame
, vì số lượng không null có thể khác nhau giữa các cột trong cùng một nhóm. Để có được số đếm không null theo nhóm cho một cột cụ thể, hãy sử dụng df.groupby(...)['x'].count()
"x" là cột cần đếm.
Ví dụ mã tối thiểu
Dưới đây, tôi hiển thị các ví dụ về từng phương pháp được mô tả trong bảng trên. Đầu tiên, thiết lập -
df = pd.DataFrame({
'A': list('aabbc'), 'B': ['x', 'x', np.nan, 'x', np.nan]})
s = df['B'].copy()
df
A B
0 a x
1 a x
2 b NaN
3 b x
4 c NaN
s
0 x
1 x
2 NaN
3 x
4 NaN
Name: B, dtype: object
Row Tính của một DataFrame: len(df)
, df.shape[0]
, hoặclen(df.index)
len(df)
# 5
df.shape[0]
# 5
len(df.index)
# 5
Có vẻ ngớ ngẩn khi so sánh hiệu suất của các hoạt động thời gian liên tục, đặc biệt là khi sự khác biệt ở mức độ "nghiêm túc, đừng lo lắng về điều đó". Nhưng đây dường như là một xu hướng với các câu trả lời khác, vì vậy tôi đang làm tương tự cho sự hoàn chỉnh.
Trong số 3 phương pháp trên, len(df.index)
(như đã đề cập trong các câu trả lời khác) là nhanh nhất.
Ghi chú
- Tất cả các phương thức trên là các hoạt động thời gian không đổi vì chúng là các tra cứu thuộc tính đơn giản.
df.shape
(tương tự ndarray.shape
) là một thuộc tính trả về một tuple của (# Rows, # Cols)
. Ví dụ, df.shape
trả về (8,
2)
ví dụ ở đây.
Đếm cột của DataFrame : df.shape[1]
,len(df.columns)
df.shape[1]
# 2
len(df.columns)
# 2
Tương tự len(df.index)
, len(df.columns)
là nhanh hơn trong hai phương thức (nhưng cần nhiều ký tự hơn để gõ).
Row Đếm của một Series: len(s)
, s.size
,len(s.index)
len(s)
# 5
s.size
# 5
len(s.index)
# 5
s.size
và len(s.index)
là như nhau về tốc độ. Nhưng tôi khuyên bạn nên len(df)
.
Lưu ý
size
là một thuộc tính và nó trả về số lượng phần tử (= số lượng hàng cho bất kỳ Sê-ri nào). DataFrames cũng xác định một thuộc tính kích thước trả về kết quả tương tự như df.shape[0] * df.shape[1]
.
Số lượng hàng không Null: DataFrame.count
vàSeries.count
Các phương thức được mô tả ở đây chỉ tính các giá trị khác 0 (có nghĩa là NaN bị bỏ qua).
Gọi DataFrame.count
sẽ trả về số lượng không phải NaN cho mỗi cột:
df.count()
A 5
B 3
dtype: int64
Đối với Sê-ri, sử dụng Series.count
để có hiệu lực tương tự:
s.count()
# 3
Đếm hàng theo nhóm: GroupBy.size
Đối với DataFrames
, sử dụng DataFrameGroupBy.size
để đếm số lượng hàng trên mỗi nhóm.
df.groupby('A').size()
A
a 2
b 2
c 1
dtype: int64
Tương tự, cho Series
, bạn sẽ sử dụng SeriesGroupBy.size
.
s.groupby(df.A).size()
A
a 2
b 2
c 1
Name: B, dtype: int64
Trong cả hai trường hợp, a Series
được trả lại. Điều này cũng có ý nghĩa DataFrames
vì tất cả các nhóm chia sẻ cùng một hàng đếm.
Số lượng hàng không khôn ngoan theo nhóm: GroupBy.count
Tương tự như trên, nhưng sử dụng GroupBy.count
, không GroupBy.size
. Lưu ý rằng size
luôn trả về a Series
, trong khi count
trả về a Series
nếu được gọi trên một cột cụ thể hoặc nếu không a DataFrame
.
Các phương thức sau đây trả về cùng một điều:
df.groupby('A')['B'].size()
df.groupby('A').size()
A
a 2
b 2
c 1
Name: B, dtype: int64
Trong khi đó count
, chúng ta có
df.groupby('A').count()
B
A
a 2
b 1
c 0
... được gọi trên toàn bộ đối tượng GroupBy, v / s,
df.groupby('A')['B'].count()
A
a 2
b 1
c 0
Name: B, dtype: int64
Được gọi trên một cột cụ thể.