¿Cómo obtengo el recuento de filas de un Pandas DataFrame?

1363

Estoy tratando de obtener el número de filas de dataframe df con Pandas, y aquí está mi código.

Método 1:

total_rows = df.count
print total_rows + 1

Método 2:

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

Ambos fragmentos de código me dan este error:

TypeError: unsupported operand type(s) for +: 'instancemethod' and 'int'

¿Qué estoy haciendo mal?

3
  • 17
    ok, me enteré, debería haber llamado al método no comprobar la propiedad, por lo que debería ser df.count () no df.count
    yemu
    11 abr 13 a las 8:15
  • 79
    ^ ¡Peligroso! Tenga en cuenta que df.count()solo devolverá el recuento de filas no NA / NaN para cada columna. Debería usar df.shape[0]en su lugar, que siempre le dirá correctamente el número de filas.
    smci
    18/04/2014 a las 12:04
  • 4
    Tenga en cuenta que df.count no devolverá un int cuando el marco de datos esté vacío (por ejemplo, pd.DataFrame (columnas = ["Blue", "Red"). Count no es 0) 1 de septiembre de 2015 a las 3:32
1959

Para un marco de datos df, se puede utilizar cualquiera de los siguientes:

  • len(df.index)
  • df.shape[0]
  • df[df.columns[0]].count() (más lento, pero evita contar los valores de NaN en la primera columna)

Gráfico de rendimiento


Código para reproducir la trama:

import numpy as np
import pandas as pd
import perfplot

perfplot.save(
    "out.png",
    setup=lambda n: pd.DataFrame(np.arange(n * 3).reshape(n, 3)),
    n_range=[2**k for k in range(25)],
    kernels=[
        lambda df: len(df.index),
        lambda df: df.shape[0],
        lambda df: df[df.columns[0]].count(),
    ],
    labels=["len(df.index)", "df.shape[0]", "df[df.columns[0]].count()"],
    xlabel="Number of rows",
)
15
  • 19
    Hay una buena razón para usarlo shapeen el trabajo interactivo, en lugar de len (df): al probar diferentes filtros, a menudo necesito saber cuántos elementos quedan. Con shape puedo ver eso simplemente agregando .shape después de mi filtrado. Con len () la edición de la línea de comandos se vuelve mucho más engorrosa, yendo y viniendo. 25 de febrero de 2014 a las 4:51
  • 10
    No funcionará para OP, pero si solo necesita saber si el marco de datos está vacío, df.emptyes la mejor opción. 16/03/2016 a las 21:26
  • 21
    Sé que ha pasado un tiempo, pero no len (df.index) tarda 381 nanosegundos, o 0,381 microsegundos, df.shape es 3 veces más lento, tarda 1,17 microsegundos. ¿Me he perdido algo? @raíz
    T.G.
    22 de mayo de 2017 a las 18:34
  • 12
    (3,3) la matriz es un mal ejemplo ya que no muestra el orden de la tupla de forma
    xaedes
    15 de agosto de 2017 a las 16:42
  • 7
    ¿Cómo es df.shape[0]más rápido que len(df)o len(df.columns)? Dado que 1 ns (nanosegundo) = 1000 µs (microsegundo), por lo tanto 1,17 µs = 1170 ns, lo que significa que es aproximadamente 3 veces más lento que 381 ns
    itsjef
    24 de marzo de 2018 a las 3:19
401

Supongamos que dfes su marco de datos entonces:

count_row = df.shape[0]  # Gives number of rows
count_col = df.shape[1]  # Gives number of columns

O, más sucintamente,

r, c = df.shape
5
  • 13
    Si el conjunto de datos es grande, len (df.index) es significativamente más rápido que df.shape [0] si solo necesita el recuento de filas. Lo probé. 2/01/20 a las 14:47
  • 1
    ¿Por qué no tengo el método de forma en mi DataFrame? 6 oct.20 a las 20:00
  • 1
    @ArdalanShahgholi probablemente se deba a que lo que se devolvió es una serie, que siempre es unidimensional. Por lo tanto, solo len(df.index)funcionará
    Connor
    1 de agosto a las 23:54
  • @Connor Necesito tener Número de filas y número de Columnas de mi DF. En mi DF también tengo una selección, significa que tengo una mesa y ahora la pregunta es ¿por qué no tengo la función SHAPE en mi DF? 17 de agosto a las 18:41
  • Gran pregunta, conviértala en una pregunta separada sobre SO, comparta lo que ha probado y lo que ve como resultado (proporcione un conjunto completo de código de trabajo que sea fácil de replicar para otros) y luego comparta el enlace a esa pregunta aquí. Veré si puedo ayudar
    Connor
    19 de agosto a las 20:06
206

Utilice len(df):-).

__len__() se documenta con "Devuelve la longitud del índice".

Información de tiempo, configúrelo de la misma manera que en la respuesta de 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

Debido a una llamada de función adicional, por supuesto es correcto decir que es un poco más lento que llamar len(df.index)directamente. Pero esto no debería importar en la mayoría de los casos. Me parece len(df)bastante legible.

1
  • basado, gracias 7 de septiembre a las 16:18
120

How do I get the row count of a Pandas DataFrame?

Esta tabla resume las diferentes situaciones en las que querría contar algo en un DataFrame (o Serie, para completar), junto con los métodos recomendados.

Ingrese la descripción de la imagen aquí

Footnotes

  1. DataFrame.count returns counts for each column as a Series since the non-null count varies by column.
  2. DataFrameGroupBy.size returns a Series, since all columns in the same group share the same row-count.
  3. DataFrameGroupBy.count returns a DataFrame, since the non-null count could differ across columns in the same group. To get the group-wise non-null count for a specific column, use df.groupby(...)['x'].count() where "x" is the column to count.

# Ejemplos de código mínimo

A continuación, muestro ejemplos de cada uno de los métodos descritos en la tabla anterior. Primero, la configuración -

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

Recuento de filas de una trama de datos: len(df), df.shape[0]olen(df.index)

len(df)
# 5

df.shape[0]
# 5

len(df.index)
# 5

Parece una tontería comparar el rendimiento de las operaciones de tiempo constante, especialmente cuando la diferencia está en el nivel de "en serio, no se preocupe". Pero esto parece ser una tendencia con otras respuestas, así que estoy haciendo lo mismo para completar.

De los tres métodos anteriores, len(df.index)(como se menciona en otras respuestas) es el más rápido.

Note

  • All the methods above are constant time operations as they are simple attribute lookups.
  • df.shape (similar to ndarray.shape) is an attribute that returns a tuple of (# Rows, # Cols). For example, df.shape returns (8, 2) for the example here.

Número de columnas de una trama de datos: df.shape[1],len(df.columns)

df.shape[1]
# 2

len(df.columns)
# 2

Análogo a len(df.index), len(df.columns)es el más rápido de los dos métodos (pero requiere más caracteres para escribir).

Número de filas de una Serie: len(s), s.size,len(s.index)

len(s)
# 5

s.size
# 5

len(s.index)
# 5

s.sizey len(s.index)son aproximadamente iguales en términos de velocidad. Pero lo recomiendo len(df).

Note size is an attribute, and it returns the number of elements (=count of rows for any Series). DataFrames also define a size attribute which returns the same result as df.shape[0] * df.shape[1].

Recuento de filas no nulas: DataFrame.countySeries.count

Los métodos descritos aquí solo cuentan valores no nulos (lo que significa que los NaN se ignoran).

La llamada DataFrame.countdevolverá recuentos que no son NaN para cada columna:

df.count()

A    5
B    3
dtype: int64

Para Series, use Series.countcon un efecto similar:

s.count()
# 3

Recuento de filas por grupo: GroupBy.size

Para DataFrames, use DataFrameGroupBy.sizepara contar el número de filas por grupo.

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

A
a    2
b    2
c    1
dtype: int64

Del mismo modo, Seriesutilizará SeriesGroupBy.size.

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

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

En ambos casos, Seriesse devuelve a. Esto también tiene sentido DataFrames, ya que todos los grupos comparten el mismo recuento de filas.

Recuento de filas no nulas por grupo: GroupBy.count

Similar al anterior, pero use GroupBy.count, no GroupBy.size. Tenga en cuenta que sizesiempre devuelve a Series, mientras que countdevuelve a Seriessi se llama en una columna específica, o de lo contrario a DataFrame.

Los siguientes métodos devuelven lo mismo:

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

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

Mientras tanto count, tenemos

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

   B
A
a  2
b  1
c  0

... llamado a todo el objeto GroupBy, vs.,

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

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

Llamado en una columna específica.

54

TL; uso de DRlen(df)

len()le permite obtener el número de elementos de una lista. Entonces, para obtener recuentos de filas de un DataFrame, simplemente use len(df).

Alternativamente, puede acceder a todas las filas y todas las columnas con df.index, y df.columns, respectivamente. Como puede usar len(anyList)para obtener los números de los elementos, use len(df.index)le dará el número de filas y len(df.columns)el número de columnas.

O puede usar df.shapeque devuelve el número de filas y columnas juntas (como una tupla). Si desea acceder al número de filas, utilice únicamente df.shape[0]. Para el número de columnas, utilice únicamente: df.shape[1].

22

Además de las respuestas anteriores, puede usar df.axespara obtener la tupla con índices de fila y columna y luego usar la len()función:

total_rows = len(df.axes[0])
total_cols = len(df.axes[1])
1
  • 3
    Esto devuelve objetos de índice, que pueden o no ser copias del original, lo cual es un desperdicio si simplemente los descarta después de verificar la longitud. A menos que tenga la intención de hacer algo más con el índice, NO LO USE .
    cs95
    30/03/19 a las 20:13
11

... basándose en la respuesta de Jan-Philip Gehrcke .

La razón por la que len(df)o len(df.index)es más rápido que df.shape[0]:

Mira el código. df.shape es un @propertyque ejecuta un método DataFrame llamando lendos veces.

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)

Y debajo del capó de 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)será un poco más rápido que len(df)ya que tiene una llamada de función menos, pero esto siempre es más rápido quedf.shape[0]

2
  • El resaltado de sintaxis no parece del todo correcto. ¿Puedes arreglarlo? Por ejemplo, ¿es esto una mezcla de salida, código y anotación (no una pregunta retórica)? 8 de febrero a las 15:22
  • @PeterMortensen Esta salida es de ipython / jupyter. La ejecución de un nombre de función con dos signos de interrogación y sin paréntesis mostrará la definición de la función. es decir, para la función len()que ejecutaríaslen??
    debo
    8 de abril a las 4:04
8

Llego a Pandas desde un fondo R , y veo que Pandas es más complicado cuando se trata de seleccionar filas o columnas.

Tuve que luchar con eso por un tiempo, y luego encontré algunas formas de lidiar con:

Obteniendo el número de columnas:

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

Obteniendo el número de filas:

len(df.index) # It's similar.
1
  • Después de usar Pandas por un tiempo, creo que deberíamos seguir df.shape. Devuelve el número de filas y columnas respectivamente. 29/10/18 a las 10:16
7

También puede hacer esto:

Digamos que dfes su marco de datos. Luego df.shapele da la forma de su marco de datos, es decir,(row,col)

Por lo tanto, asigne el siguiente comando para obtener el

 row = df.shape[0], col = df.shape[1]
1
  • O puede usar directamente en su row, col = df.shapelugar si necesita obtener ambos al mismo tiempo (es más corto y no tiene que preocuparse por los índices).
    Nerxis
    17 de mayo a las 20:46 h.
6

En caso de que desee obtener el recuento de filas en medio de una operación encadenada, puede usar:

df.pipe(len)

Ejemplo:

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

Esto puede resultar útil si no desea poner una declaración larga dentro de una len()función.

Podrías usarlo __len__()en su lugar, pero se __len__()ve un poco extraño.

1
  • Parece inútil querer "canalizar" esta operación porque no hay nada más en lo que pueda canalizar esto (devuelve un número entero). Preferiría mucho count = len(df.reset_index())que count = df.reset_index().pipe(len). El primero es solo una búsqueda de atributos sin la llamada a la función.
    cs95
    30/03/19 a las 20:15
3

Para el marco de datos df, un recuento de filas con formato de coma impreso que se utiliza al explorar datos:

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

Ejemplo:

nrow(my_df)
12,456,789
3

Cualquiera de estos puede hacerlo ( dfes el nombre del DataFrame):

Método 1 : uso de la lenfunción:

len(df)dará el número de filas en un DataFrame llamado df.

Método 2 : countfunción de uso :

df[col].count()contará el número de filas en una columna determinada col.

df.count() dará el número de filas para todas las columnas.

1
  • 4
    Esta es una buena respuesta, pero ya hay suficientes respuestas a esta pregunta, por lo que esto realmente no agrega nada.
    John
    24 abr.20 a las 18:07
0

Un método alternativo para averiguar la cantidad de filas en un marco de datos que creo que es la variante más legible es pandas.Index.size.

Tenga en cuenta que, como comenté en la respuesta aceptada ,

Suspected pandas.Index.size would actually be faster than len(df.index) but timeit on my computer tells me otherwise (~150 ns slower per loop).

0

No estoy seguro de si esto funcionaría (los datos podrían omitirse), pero esto puede funcionar:

*dataframe name*.tails(1)

y luego, usando esto, puede encontrar el número de filas ejecutando el fragmento de código y mirando el número de fila que se le dio.

-1

Piense, el conjunto de datos es "datos" y el nombre de su conjunto de datos como "data_fr" y el número de filas en el data_fr es "nu_rows"

#import the data frame. Extention could be different as csv,xlsx or etc.
data_fr = pd.read_csv('data.csv')

#print the number of rows
nu_rows = data_fr.shape[0]
print(nu_rows)
-2
# this will give you the number of rows in the dataframe df
df.shape[0]
1
  • El uso df.shape[0]fue una de las posibles soluciones discutidas en la respuesta aceptada de 2013. 7 de julio a las 21:55