Dataframe.resample () działa tylko z danymi Timeeries. Nie mogę znaleźć sposobu na pobranie każdego n-tego wiersza z danych spoza serii. Jaka jest najlepsza metoda?
Odpowiedzi:
Użyłbym iloc
, który pobiera wycinek wiersza / kolumny, zarówno na podstawie pozycji całkowitej, jak i zgodnie z normalną składnią Pythona.
df.iloc[::5, :]
df.iloc[::5]
Chociaż zaakceptowana odpowiedź @ chrisb odpowiada na pytanie, chciałbym dodać do niej co następuje.
Prosta metoda, której używam, aby pobrać nth
dane lub upuścić nth
wiersz, jest następująca:
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
To próbkowanie oparte na arytmetyce umożliwia jeszcze bardziej złożone selekcje wierszy.
To zakłada , oczywiście, że masz index
kolumnę zamawianych, kolejnych liczb całkowitych, zaczynając od 0.
Istnieje jeszcze prostsze rozwiązanie przyjętej odpowiedzi, które obejmuje bezpośrednie wywołanie 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
Na przykład, aby uzyskać co 2 wiersze, możesz to zrobić
df[::2]
a b c
0 x x x
2 x x x
4 x x x
W indeksie znajduje się również GroupBy.first
/ GroupBy.head
, grupujesz:
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
Indeks jest podzielony na podłogę przez krok (w tym przypadku 2). Jeśli indeks nie jest numeryczny, zrób to
# 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, :]
.