Pandas cada enésima fila

108

Dataframe.resample () solo funciona con datos de series temporales. No puedo encontrar una manera de obtener cada enésima fila a partir de datos que no son de series temporales. Cual es el mejor metodo?

Mixel
fuente

Respuestas:

201

Yo usaría iloc, que toma un segmento de fila / columna, ambos basados ​​en la posición del número entero y siguiendo la sintaxis normal de Python.

df.iloc[::5, :]
Chrisb
fuente
46
Para aquellos que quieran, por ejemplo, cada quinta fila, pero a partir de la segunda fila sería df.iloc[1::5, :].
Little Bobby Tables
17
Puede omitir la parte de la columna:df.iloc[::5]
joctee
1
@chrisb ¿cómo especifico la fila de inicio? como cada 5 filas, comenzando desde la segunda fila?
FabioSpaghetti
30

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 enteros ordenados y consecutivos que comienzan en 0.

metaestableB
fuente
6
esta no es una buena respuesta porque hace tres supuestos, que con frecuencia no se cumplen: (1) el índice es numérico (2) el índice comienza en cero (3) los valores del índice son consecutivos ... el último es especialmente importante ya que no puede usar su método sugerido más de una vez sin restablecer el índice
Constantine
1
Entiendo tu punto. Editará la respuesta para hacer las suposiciones más explícitas .
metastableB
1
@Constantine aún, ¿no sería más rápido que la otra solución, ya que simplemente puede agregar un índice?
Readler
8

Existe una solución aún más simple para 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, puede hacer

df[::2]

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

También hay GroupBy.first/ GroupBy.head, agrupa 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 piso por la zancada (2, en este caso). Si el índice no es numérico, 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
fuente
1

Tenía un requisito similar, pero quería el artículo n en un grupo en particular. Así es como lo resolví.

groups = data.groupby(['group_key'])
selection = groups['index_col'].apply(lambda x: x % 3 == 0)
subset = data[selection]
Steztric
fuente