Panda ogni ennesima fila


109

Dataframe.resample () funziona solo con i dati timeseries. Non riesco a trovare un modo per ottenere ogni ennesima riga da dati non timeseries. Qual è il metodo migliore?

Risposte:


203

Userei iloc, che accetta una fetta di riga / colonna, sia basata sulla posizione del numero intero che seguendo la normale sintassi di Python.

df.iloc[::5, :]

46
Per coloro che potrebbero volere, ad esempio, ogni quinta fila, ma a partire dalla seconda fila lo sarebbe df.iloc[1::5, :].
Little Bobby Tables

17
Puoi omettere la parte della colonna:df.iloc[::5]
joctee

1
@chrisb come faccio a specificare la riga iniziale? come ogni 5 righe, partendo dalla seconda riga?
FabioSpaghetti

30

Sebbene la risposta accettata da @ chrisb risponda alla domanda, vorrei aggiungere quanto segue.

Un metodo semplice che utilizzo per ottenere i nthdati o eliminare la nthriga è il seguente:

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

Questo campionamento basato su aritmetica ha la capacità di abilitare selezioni di righe ancora più complesse.

Ciò presuppone , ovviamente, che tu abbia una indexcolonna di numeri interi ordinati, consecutivi, a partire da 0.


6
questa non è una buona risposta perché fa tre ipotesi, che spesso non sono soddisfatte: (1) l'indice è numerico (2) l'indice inizia da zero (3) i valori dell'indice sono consecutivi ... l'ultimo è particolarmente importante poiché non è possibile utilizzare il metodo suggerito più di una volta senza reimpostare l'indice
Constantine

1
Capisco cosa vuoi dire. Modificherà la risposta per rendere le ipotesi più esplicite .
metastabileB

1
@ Costantino ancora, non sarebbe più veloce dell'altra soluzione dato che puoi semplicemente aggiungere un indice?
Readler

8

Esiste una soluzione ancora più semplice per la risposta accettata che implica l'invocazione diretta 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

Ad esempio, per ottenere ogni 2 righe, puoi farlo

df[::2]

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

C'è anche GroupBy.first/ GroupBy.head, raggruppa sull'indice:

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

L'indice è diviso dal pavimento in base alla falcata (2, in questo caso). Se l'indice non è numerico, fallo

# 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

1

Avevo un requisito simile, ma volevo l'ennesimo articolo in un particolare gruppo. Ecco come l'ho risolto.

groups = data.groupby(['group_key'])
selection = groups['index_col'].apply(lambda x: x % 3 == 0)
subset = data[selection]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.