Pandas cada enésima fila
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?
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, :]
Aunque la respuesta aceptada de @chrisb responde la pregunta, me gustaría agregarle lo siguiente.
Un método simple que utilizo para obtener los nth
datos o eliminar la nth
fila 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 index
columna de números enteros ordenados y consecutivos que comienzan en 0.
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