Jak uzyskać liczbę wierszy pandy DataFrame?


929

Próbuję uzyskać liczbę wierszy ramki danych df za pomocą Pandas, a oto mój kod.

Metoda 1:

total_rows = df.count
print total_rows +1

Metoda 2:

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

Oba fragmenty kodu dają mi ten błąd:

TypeError: nieobsługiwane typy operandów dla +: „instancemethod” i „int”

Co ja robię źle?


12
ok, dowiedziałem się, że powinienem był wywołać metodę not check property, więc powinna to być df.count () no df.count
— yemu 11.04.13

56
^ Niebezpieczne! Uwaga: df.count()zwracana będzie tylko liczba wierszy bez NA / NaN dla każdej kolumny. Zamiast tego należy użyć df.shape[0], który zawsze poprawnie poda liczbę wierszy.
— smci

3
Zauważ, że df.count nie zwróci liczby int, gdy ramka danych jest pusta (np. Pd.DataFrame (kolumny = [„Niebieski”, „Czerwony”). Liczba nie jest 0)
— Marcelo Bielsa

Odpowiedzi:


1247

Możesz użyć .shapenieruchomości lub po prostu len(DataFrame.index). Istnieją jednak znaczące różnice w wydajności ( len(DataFrame.index)jest najszybsza):

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)

wprowadź opis zdjęcia tutaj

EDYCJA: Jak zauważył @Dan Allen w komentarzach len(df.index)i df[0].count()nie można ich zamieniać, ponieważ countwyklucza NaNs,


13
Jest jeden dobry powód, dla którego warto używać shapew pracy interaktywnej, zamiast len ​​(df): Wypróbowując inne filtrowanie, często muszę wiedzieć, ile pozostało elementów. Z kształtem widzę to po dodaniu .shape po moim filtrowaniu. Dzięki len () edycja wiersza poleceń staje się znacznie bardziej kłopotliwa, przechodząc tam iz powrotem.
— K.-Michael Aye

9
Nie będzie działać dla OP, ale jeśli potrzebujesz tylko wiedzieć, czy ramka danych jest pusta, df.emptyjest najlepszą opcją.
— jtschoonhoven

19
Wiem, że minęło trochę czasu, ale nie len (df.index) zajmuje 381 nanosekund, czyli 0,381 mikrosekund, kształt df. Jest 3 razy wolniejszy, zajmuje 1,17 mikrosekundy. przegapiłem coś? @root
— TG

11
(3,3) matryca jest złym przykładem, ponieważ nie pokazuje kolejności krotki kształtu
— xaedes

4
Jak jest df.shape[0]szybszy niż len(df)lub len(df.columns)? Ponieważ 1 ns (nanosekunda) = 1000 µs (mikrosekunda), dlatego 1,17 µs = 1170ns, co oznacza, że ​​jest on około 3 razy wolniejszy niż 381ns
— itsjef

303

Załóżmy, że dftwoja ramka danych to:

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

Lub, bardziej zwięźle,

r, c = df.shape

4
Jeśli zestaw danych jest duży, len (df.index) jest znacznie szybszy niż df.shape [0], jeśli potrzebujesz tylko liczby wierszy. Przetestowałem to.
— Sumit Pokhrel

145

Zastosowanie len(df). Działa to od pand 0.11, a może nawet wcześniej.

__len__()jest obecnie (0.12) udokumentowany Returns length of index. Informacje o czasie, skonfiguruj tak samo, jak w odpowiedzi roota:

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

Ze względu na jedno dodatkowe wywołanie funkcji jest nieco wolniejsze niż len(df.index)bezpośrednie wywoływanie , ale nie powinno to odgrywać żadnej roli w większości przypadków użycia.


81

Jak uzyskać liczbę wierszy pandy DataFrame?

Ta tabela podsumowuje różne sytuacje, w których chcesz policzyć coś w DataFrame (lub Series, dla kompletności), wraz z zalecanymi metodami.

wprowadź opis zdjęcia tutaj

Przypisy

  1. DataFrame.countzwraca liczbę dla każdej kolumny jako, Seriesponieważ liczba różna od wartości różni się w zależności od kolumny.
  2. DataFrameGroupBy.sizezwraca a Series, ponieważ wszystkie kolumny w tej samej grupie mają tę samą liczbę wierszy.
  3. DataFrameGroupBy.countzwraca a DataFrame, ponieważ liczba różna od zera może się różnić między kolumnami w tej samej grupie. Aby uzyskać grupową liczbę niepustą dla określonej kolumny, użyj df.groupby(...)['x'].count()gdzie „x” oznacza kolumnę do zliczenia.

Przykłady minimalnego kodu

Poniżej pokazuję przykłady każdej z metod opisanych w powyższej tabeli. Po pierwsze, konfiguracja -

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

Liczba wierszy z DataFrame: len(df), df.shape[0]lublen(df.index)

len(df)
# 5

df.shape[0]
# 5

len(df.index)
# 5

Głupio wydaje się porównywanie wydajności operacji o stałym czasie, zwłaszcza gdy różnica jest na poziomie „poważnie, nie martw się o to”. Ale wydaje się, że jest to trend w przypadku innych odpowiedzi, więc robię to samo dla kompletności.

Z 3 powyższych metod len(df.index)(jak wspomniano w innych odpowiedziach) jest najszybszy.

Uwaga

  • Wszystkie powyższe metody są operacjami o stałym czasie, ponieważ są prostymi przeglądami atrybutów.
  • df.shape(podobny do ndarray.shape) to atrybut, który zwraca krotkę (# Rows, # Cols). Na przykład df.shapezwraca (8, 2)tutaj przykład.

Kolumna Hrabia z DataFrame: df.shape[1],len(df.columns)

df.shape[1]
# 2

len(df.columns)
# 2

Analogicznie do len(df.index), len(df.columns)jest szybsza z dwóch metod (ale potrzeba więcej znaków do wpisania).

Wiersz liczyć z serii: len(s), s.size,len(s.index)

len(s)
# 5

s.size
# 5

len(s.index)
# 5

s.sizei len(s.index)są mniej więcej takie same pod względem prędkości. Ale polecam len(df).

Uwaga
size jest atrybutem i zwraca liczbę elementów (= liczba wierszy dla dowolnej serii). DataFrames definiują również atrybut rozmiaru, który zwraca ten sam wynik co df.shape[0] * df.shape[1].

Liczba wierszy niepustych: DataFrame.countiSeries.count

Opisane tutaj metody liczą tylko wartości inne niż null (co oznacza, że ​​NaN są ignorowane).

Wywołanie DataFrame.countzwróci liczby inne niż NaN dla każdej kolumny:

df.count()

A    5
B    3
dtype: int64

W przypadku serii użyj Series.countpodobnego efektu:

s.count()
# 3

Grupowa liczba wierszy: GroupBy.size

Do DataFramesużyj, DataFrameGroupBy.sizeaby policzyć liczbę wierszy na grupę.

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

A
a    2
b    2
c    1
dtype: int64

Podobnie, Seriesużyjesz SeriesGroupBy.size.

s.groupby(df.A).size()

A
a    2
b    2
c    1
Name: B, dtype: int64

W obu przypadkach Serieszwracane jest a . Ma to sensDataFrames ponieważ wszystkie grupy mają tę samą liczbę wierszy.

Grupowa liczba wierszy niepustych: GroupBy.count

Podobnie jak powyżej, ale użyj GroupBy.count, nie GroupBy.size. Zauważ, że sizezawsze zwraca a Series, podczas gdy countzwraca Seriesif, jeśli jest wywoływany w określonej kolumnie, albo też DataFrame.

Następujące metody zwracają to samo:

df.groupby('A')['B'].size()
df.groupby('A').size()

A
a    2
b    2
c    1
Name: B, dtype: int64

Tymczasem countmamy

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

   B
A   
a  2
b  1
c  0

... wywołany dla całego obiektu GroupBy, v / s,

df.groupby('A')['B'].count()

A
a    2
b    1
c    0
Name: B, dtype: int64

Wywoływany w określonej kolumnie.


35

TL; DR

posługiwać się len(df)


len()jest twoim przyjacielem, może być używany do liczenia wierszy jako len(df).

Alternatywnie możesz uzyskać dostęp do wszystkich wierszy według df.indexi wszystkich kolumn według df.columns, a ponieważ możesz użyć len(anyList)do uzyskania liczby list, użyj len(df.index)do uzyskania liczby wierszy ilen(df.columns) do liczby kolumn.

Albo można użyć df.shapektóra zwraca liczbę wierszy i kolumn razem, jeśli chcesz uzyskać dostęp liczba wierszy używać tylko df.shape[0]i liczby kolumn używać tylko: df.shape[1].


19

Oprócz powyższych odpowiedzi użyj można użyć, df.axesaby uzyskać krotkę z indeksami wierszy i kolumn, a następnie użyć len()funkcji:

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

2
Zwraca obiekty indeksu, które mogą, ale nie muszą być kopiami oryginału, co jest marnotrawstwem, jeśli odrzucasz je po sprawdzeniu długości. O ile nie zamierzasz robić nic więcej z indeksem, NIE UŻYWAJ .
— cs95

9

... opierając się na odpowiedzi Jana-Philipa Gehrckego.

Powód, dla którego len(df)lub len(df.index)jest szybszy niż df.shape[0]. Spójrz na kod. df.shape to metoda, @propertyktóra uruchamia dwukrotnie metodę DataFrame len.

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)

I pod maską 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)będzie nieco szybszy niż, len(df)ponieważ ma jedno wywołanie funkcji mniej, ale zawsze jest to szybsze niżdf.shape[0]


7

Przychodzę do pand z Rtła i widzę, że pandy są bardziej skomplikowane, jeśli chodzi o wybór wiersza lub kolumny. Przez jakiś czas musiałem się z tym zmagać, a potem znalazłem sposoby na radzenie sobie z:

pobieranie liczby kolumn:

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.

uzyskanie liczby rzędów:

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

Myślę, że po dłuższym korzystaniu z Pand powinniśmy iść z tym df.shape. Zwraca odpowiednio liczbę wierszy i kolumn.
— Catbuilts

4

Jeśli chcesz uzyskać liczbę wierszy w trakcie operacji łańcuchowej, możesz użyć:

df.pipe(len)

Przykład:

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

Może to być przydatne, jeśli nie chcesz wstawiać długiej instrukcji do pliku len() funkcji.

Możesz użyć __len__()zamiast tego, ale __len__()wygląda trochę dziwnie.


Wydaje się bezcelowe chcieć „potokować” tę operację, ponieważ nie ma nic innego, do czego można by ją potokować (zwraca liczbę całkowitą). Chętniej count = len(df.reset_index())niż count = df.reset_index().pipe(len). To pierwsze jest tylko wyszukiwaniem atrybutów bez wywołania funkcji.
— cs95

1

Hej, możesz użyć, zrób to również:

Powiedzmy, że dfto twoja ramka danych. Następnie df.shapedaje kształt ramki danych, tj(row,col)

Dlatego przypisz poniższe polecenie, aby uzyskać wymagane

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

0

W przypadku ramki danych df drukowana liczba wierszy w formacie przecinka używana podczas eksploracji danych:

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

Przykład:

nrow(my_df)
12,456,789

0

Alternatywną metodą do znalezienia liczby wierszy w ramce danych, która moim zdaniem jest najbardziej czytelnym wariantem, jest pandas.Index.size .

Zauważ, że jak skomentowałem przyjętą odpowiedź:

Podejrzewam, pandas.Index.sizeże faktycznie byłoby szybsze niż, len(df.index)ale timeitna moim komputerze mówi mi inaczej (~ 150 ns wolniej na pętlę).


0

Nie jestem pewien, czy to zadziała (dane MOGĄ zostać pominięte), ale może to działać:

*dataframe name*.tails(1)

a następnie za pomocą tego można znaleźć liczbę wierszy, uruchamiając fragment kodu i sprawdzając numer wiersza, który został Ci przekazany.


-2

Można to zrobić dowolnie ( dfjest to nazwa DataFrame):

Metoda 1: Korzystanie z lenfunkcji:

len(df)poda liczbę wierszy w nazwie DataFrame df.

Metoda 2: Korzystanie z countfunkcji:

df[col].count() policzy liczbę wierszy w danej kolumnie col .

df.count() poda liczbę wierszy dla wszystkich kolumn.


3
To dobra odpowiedź, ale odpowiedzi na to pytanie są już wystarczające, więc tak naprawdę nic nie dodaje.
— John
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.