Làm cách nào để tôi có được số lượng hàng của DataFrame gấu trúc?


935

Tôi đang cố gắng để có được số lượng hàng của dataframe df với Pandas và đây là mã của tôi.

Cách 1:

total_rows = df.count
print total_rows +1

Cách 2:

total_rows = df['First_columnn_label'].count
print total_rows +1

Cả hai đoạn mã đều cho tôi lỗi này:

TypeError: loại toán hạng không được hỗ trợ cho +: 'instancemethod' và 'int'

Tôi đang làm gì sai?


12
ok Tôi phát hiện ra, tôi nên gọi phương thức không kiểm tra thuộc tính, vì vậy nó phải là df.count () no df.count
yemu

56
^ Nguy hiểm! Coi chừng df.count()sẽ chỉ trả về số lượng hàng không NA / NaN cho mỗi cột. Bạn nên sử dụng df.shape[0]thay thế, nó sẽ luôn cho bạn biết chính xác số lượng hàng.
smci

3
Lưu ý rằng df.count sẽ không trả về int khi khung dữ liệu trống (ví dụ: pd.DataFrame (cột = ["Blue", "Red"). Đếm không phải là 0)
Marcelo Bielsa

Câu trả lời:


1253

Bạn có thể sử dụng .shapetài sản hoặc chỉ len(DataFrame.index). Tuy nhiên, có những khác biệt hiệu suất đáng chú ý ( len(DataFrame.index)là nhanh nhất):

In [1]: import numpy as np

In [2]: import pandas as pd

In [3]: df = pd.DataFrame(np.arange(12).reshape(4,3))

In [4]: df
Out[4]: 
   0  1  2
0  0  1  2
1  3  4  5
2  6  7  8
3  9  10 11

In [5]: df.shape
Out[5]: (4, 3)

In [6]: timeit df.shape
2.77 µs ± 644 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [7]: timeit df[0].count()
348 µs ± 1.31 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [8]: len(df.index)
Out[8]: 4

In [9]: timeit len(df.index)
990 ns ± 4.97 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

nhập mô tả hình ảnh ở đây

EDIT: Như @Dan Allen đã lưu ý trong các bình luận len(df.index)df[0].count()không thể thay thế cho nhau như countloại trừ NaNs,


13
Có một lý do chính đáng để sử dụng shapetrong công việc tương tác, thay vì len (df): Thử lọc các bộ lọc khác nhau, tôi thường cần biết còn lại bao nhiêu mục. Với hình dạng tôi có thể thấy điều đó chỉ bằng cách thêm .shape sau khi lọc. Với len () việc chỉnh sửa dòng lệnh trở nên cồng kềnh hơn nhiều, qua lại.
K.-Michael Aye

9
Sẽ không hoạt động cho OP, nhưng nếu bạn chỉ cần biết liệu khung dữ liệu có trống không, df.emptylà lựa chọn tốt nhất.
jtschoonhoven

19
Tôi biết đã được một lúc, nhưng không phải len (df.index) mất tới 380 nano giây, hay 0,381 micro giây, df.shape chậm hơn 3 lần, mất 1,17 micro giây. tôi có bỏ lỡ điều gì không? @root
TG

11
(3,3) ma trận là ví dụ tồi vì nó không hiển thị thứ tự của hình dạng tuple
xaedes

4
Làm thế nào là df.shape[0]nhanh hơn len(df)hoặc len(df.columns)? Vì 1 ns (nano giây) = 1000 Lời (micro giây), do đó 1,17 điện tử = 1170ns, có nghĩa là nó chậm hơn khoảng 3 lần so với 381ns
vào

304

Giả sử dflà khung dữ liệu của bạn sau đó:

count_row = df.shape[0]  # gives number of row count
count_col = df.shape[1]  # gives number of col count

Hoặc, ngắn gọn hơn,

r, c = df.shape

4
Nếu tập dữ liệu lớn, len (df.index) nhanh hơn đáng kể so với df.shape [0] nếu bạn chỉ cần đếm hàng. Tôi đã thử nó.
Sumit Pokhrel

145

Sử dụng len(df). Điều này hoạt động như gấu trúc 0.11 hoặc thậm chí sớm hơn.

__len__()hiện tại (0.12) được ghi lại bằng Returns length of index. Thông tin về thời gian, thiết lập giống như trong câu trả lời của root:

In [7]: timeit len(df.index)
1000000 loops, best of 3: 248 ns per loop

In [8]: timeit len(df)
1000000 loops, best of 3: 573 ns per loop

Do một chức năng bổ sung gọi nó chậm hơn một chút so với gọi len(df.index)trực tiếp, nhưng điều này sẽ không đóng vai trò nào trong hầu hết các trường hợp sử dụng.


81

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.

nhập mô tả hình ảnh ở đây

Chú thích

  1. DataFrame.counttrả về số lượng cho mỗi cột Seriesvì số lượng khác không thay đổi theo cột.
  2. DataFrameGroupBy.sizetrả 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.
  3. DataFrameGroupBy.counttrả 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.shapetrả 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.sizelen(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.countSeries.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.countsẽ 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 DataFramesvì 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 sizeluôn trả về a Series, trong khi counttrả về a Seriesnế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ể.


35

TL; DR

sử dụng len(df)


len()là bạn của bạn, nó có thể được sử dụng để đếm hàng len(df).

Ngoài ra, bạn có thể truy cập tất cả các hàng theo df.indexvà tất cả các cột theo df.columns, và như bạn có thể sử dụng len(anyList)để lấy số lượng danh sách, sử dụng len(df.index)để lấy số lượng hàng và len(df.columns)cho số lượng cột.

Hoặc, bạn có thể sử dụng df.shapetrả về số lượng hàng và cột cùng nhau, nếu bạn muốn truy cập số lượng hàng chỉ sử dụng df.shape[0]và đối với số lượng cột chỉ sử dụng : df.shape[1].


19

Ngoài các câu trả lời trên, có thể sử dụng df.axesđể lấy bộ dữ liệu với các chỉ mục hàng và cột và sau đó sử dụng len()hàm:

total_rows=len(df.axes[0])
total_cols=len(df.axes[1])

2
Điều này trả về các đối tượng chỉ mục, có thể hoặc không thể là bản sao của bản gốc, thật lãng phí nếu bạn chỉ loại bỏ chúng sau khi kiểm tra độ dài. Trừ khi bạn có ý định làm bất cứ điều gì khác với chỉ mục, KHÔNG SỬ DỤNG .
cs95

9

... dựa trên câu trả lời của Jan-Philip Gehrcke.

Lý do tại sao len(df)hoặc len(df.index)nhanh hơn df.shape[0]. Nhìn vào mã. df.shape là một @propertyphương thức chạy phương thức DataFrame gọi lenhai lần.

df.shape??
Type:        property
String form: <property object at 0x1127b33c0>
Source:     
# df.shape.fget
@property
def shape(self):
    """
    Return a tuple representing the dimensionality of the DataFrame.
    """
    return len(self.index), len(self.columns)

Và bên dưới mui xe của len (df)

df.__len__??
Signature: df.__len__()
Source:   
    def __len__(self):
        """Returns length of info axis, but here we use the index """
        return len(self.index)
File:      ~/miniconda2/lib/python2.7/site-packages/pandas/core/frame.py
Type:      instancemethod

len(df.index)sẽ nhanh hơn một chút so với len(df)khi nó có một lệnh gọi ít chức năng hơn, nhưng điều này luôn nhanh hơndf.shape[0]


7

Tôi đến với gấu trúc từ Rnền, và tôi thấy rằng gấu trúc phức tạp hơn khi chọn hàng hoặc cột. Tôi đã phải vật lộn với nó một lúc, sau đó tôi tìm ra một số cách để đối phó:

lấy số lượng cột:

len(df.columns)  
## Here:
#df is your data.frame
#df.columns return a string, it contains column's titles of the df. 
#Then, "len()" gets the length of it.

lấy số lượng hàng:

len(df.index) #It's similar.

Sau khi sử dụng Pandas một thời gian, tôi nghĩ chúng ta nên đi cùng df.shape. Nó trả về số lượng hàng và cột tương ứng.
Catbuilts

4

Trong trường hợp bạn muốn có được số hàng ở giữa một hoạt động được xâu chuỗi, bạn có thể sử dụng:

df.pipe(len)

Thí dụ:

row_count = (
      pd.DataFrame(np.random.rand(3,4))
      .reset_index()
      .pipe(len)
)

Điều này có thể hữu ích nếu bạn không muốn đặt một câu lệnh dài bên trong một len()hàm.

Bạn có thể sử dụng __len__()thay thế nhưng __len__()trông hơi lạ.


Dường như vô nghĩa khi muốn "dẫn đường" hoạt động này bởi vì không có gì khác bạn có thể dẫn nó vào (nó trả về một số nguyên). Tôi sẽ nhiều hơn count = len(df.reset_index())count = df.reset_index().pipe(len). Cái trước chỉ là một tra cứu thuộc tính mà không có chức năng gọi.
cs95

1

Này bạn cũng có thể sử dụng làm điều này:

Hãy nói dflà khung dữ liệu của bạn. Sau đó df.shapecung cấp cho bạn hình dạng của khung dữ liệu của bạn tức là(row,col)

Vì vậy, gán lệnh dưới đây để có được yêu cầu

 row = df.shape[0], col = df.shape[1]

0

Đối với dataframe df, số hàng được định dạng bằng dấu phẩy được sử dụng trong khi khám phá dữ liệu:

def nrow(df):
    print("{:,}".format(df.shape[0]))

Thí dụ:

nrow(my_df)
12,456,789

0

Một phương pháp khác để tìm ra số lượng hàng trong khung dữ liệu mà tôi nghĩ là biến thể dễ đọc nhất pandas.Index.size.

Xin lưu ý rằng như tôi đã nhận xét về câu trả lời được chấp nhận:

Nghi ngờ pandas.Index.sizethực sự sẽ nhanh hơn len(df.index)nhưng timeittrên máy tính của tôi nói với tôi khác (chậm hơn 150 ns trên mỗi vòng lặp).


0

Tôi không chắc liệu điều này có hoạt động không (dữ liệu COULD bị bỏ qua), nhưng điều này có thể hoạt động:

*dataframe name*.tails(1)

và sau đó sử dụng số này, bạn có thể tìm thấy số lượng hàng bằng cách chạy đoạn mã và xem số hàng được cung cấp cho bạn.


-2

Một trong hai điều này có thể làm ( dflà tên của DataFrame):

Cách 1: Sử dụng lenchức năng:

len(df)sẽ đưa ra số lượng hàng trong DataFrame được đặt tên df.

Cách 2: sử dụng countchức năng:

df[col].count()sẽ đếm số lượng hàng trong một cột nhất định col.

df.count() sẽ đưa ra số lượng hàng cho tất cả các cột.


3
Đây là một câu trả lời tốt, nhưng đã có câu trả lời đầy đủ cho câu hỏi này, vì vậy điều này không thực sự thêm bất cứ điều gì.
John
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.