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?

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, :]

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.


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

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]
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.