Pandy w każdym n-tym rzędzie

109

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?

Mixel
źródło

Odpowiedzi:

203

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, :]
chrisb
źródło
46
Dla tych, którzy chcą, na przykład, co piąty rząd, ale zaczynając od drugiego, tak będzie df.iloc[1::5, :].
Little Bobby Tables
17
Możesz pominąć część kolumnową:df.iloc[::5]
joctee
1
@chrisb jak określić wiersz początkowy? jak co 5 rzędów, zaczynając od drugiego rzędu?
FabioSpaghetti
30

Chociaż zaakceptowana odpowiedź @ chrisb odpowiada na pytanie, chciałbym dodać do niej co następuje.

Prosta metoda, której używam, aby pobrać nthdane lub upuścić nthwiersz, 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 indexkolumnę zamawianych, kolejnych liczb całkowitych, zaczynając od 0.

metastabilny B.
źródło
6
to nie jest dobra odpowiedź, ponieważ przyjmuje trzy założenia, które często nie są spełnione: (1) indeks jest numeryczny (2) indeks zaczyna się od zera (3) wartości indeksu następują po sobie ... ostatnie jest szczególnie ważne ponieważ nie możesz użyć sugerowanej metody więcej niż raz bez zresetowania indeksu
Constantine,
1
Rozumiem twój punkt widzenia. Zmieni odpowiedź, aby założenia były bardziej wyraźne .
metastableB
1
@Constantine nadal, czy nie byłoby to szybsze niż inne rozwiązanie, ponieważ możesz po prostu dodać indeks?
Readler
8

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
cs95
źródło
1

Miałem podobne wymaganie, ale chciałem mieć n-ty przedmiot w określonej grupie. Tak to rozwiązałem.

groups = data.groupby(['group_key'])
selection = groups['index_col'].apply(lambda x: x % 3 == 0)
subset = data[selection]
Steztric
źródło