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:
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, :]
df.iloc[::5]
Sebbene la risposta accettata da @ chrisb risponda alla domanda, vorrei aggiungere quanto segue.
Un metodo semplice che utilizzo per ottenere i nth
dati o eliminare la nth
riga è 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 index
colonna di numeri interi ordinati, consecutivi, a partire da 0.
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
df.iloc[1::5, :]
.