Pandas cada enésima fila

Resuelto mikael asked hace 10 años • 7 respuestas

Dataframe.resample()sólo funciona con datos de series temporales. No puedo encontrar una manera de obtener cada enésima fila de datos que no son de serie temporal. ¿Cuál es el mejor método?

mikael avatar Jul 31 '14 16:07 mikael
Aceptado

Yo usaría iloc, que toma un segmento de fila/columna, ambos basados ​​en la posición del entero y siguiendo la sintaxis normal de Python. Si quieres cada 5ta fila:

df.iloc[::5, :]
chrisb avatar Jul 31 '2014 11:07 chrisb

Aunque la respuesta aceptada de @chrisb responde la pregunta, me gustaría agregarle lo siguiente.

Un método simple que utilizo para obtener los nthdatos o eliminar la nthfila es el siguiente:

df1 = df[df.index % 3 != 0]  # Excludes every 3rd row starting from 0
df2 = df[df.index % 3 == 0]  # Selects every 3rd raw starting from 0

Este muestreo basado en aritmética tiene la capacidad de permitir selecciones de filas aún más complejas.

Esto supone , por supuesto, que tiene una indexcolumna de números enteros ordenados y consecutivos que comienzan en 0.

metastableB avatar Sep 10 '2017 13:09 metastableB

Existe una solución aún más simple a la respuesta aceptada que implica invocar directamente df.__getitem__.

df = pd.DataFrame('x', index=range(5), columns=list('abc'))
df

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x

Por ejemplo, para obtener cada 2 filas, puedes hacer

df[::2]

   a  b  c
0  x  x  x
2  x  x  x
4  x  x  x

También está GroupBy.first/ GroupBy.head, tu grupo en el índice:

df.index // 2
# Int64Index([0, 0, 1, 1, 2], dtype='int64')

df.groupby(df.index // 2).first()
# Alternatively,
# df.groupby(df.index // 2).head(1)

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x

El índice se divide en el suelo por la zancada (2, en este caso). Si el índice no es numérico, en su lugar haga

# df.groupby(np.arange(len(df)) // 2).first()
df.groupby(pd.RangeIndex(len(df)) // 2).first()

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x
cs95 avatar Jan 25 '2019 04:01 cs95