Pandas jede n-te Reihe


105

Dataframe.resample () funktioniert nur mit Zeitreihendaten. Ich kann keine Möglichkeit finden, jede n-te Zeile aus Nicht-Zeitreihen-Daten abzurufen. Was ist die beste Methode?

Antworten:


197

Ich würde verwenden iloc, das ein Zeilen- / Spalten-Slice benötigt, sowohl basierend auf der Ganzzahlposition als auch nach der normalen Python-Syntax.

df.iloc[::5, :]

44
Für diejenigen, die zum Beispiel jede fünfte Reihe wollen, aber ab der zweiten Reihe wäre es df.iloc[1::5, :].
Little Bobby Tables

16
Sie können den df.iloc[::5]
Spaltenteil

1
@chrisb Wie gebe ich die Startzeile an? wie alle 5 Reihen ab der zweiten Reihe?
FabioSpaghetti

30

Obwohl die akzeptierte Antwort von @ chrisb die Frage beantwortet, möchte ich Folgendes hinzufügen.

Eine einfache Methode, mit der ich die nthDaten abrufe oder die nthZeile lösche, ist die folgende:

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

Diese arithmetische Abtastung bietet die Möglichkeit, noch komplexere Zeilenauswahlen zu ermöglichen.

Dies setzt natürlich voraus , dass Sie eine indexSpalte geordneter, aufeinanderfolgender Ganzzahlen haben, die bei 0 beginnen.


6
Dies ist keine gute Antwort, da drei Annahmen getroffen werden, die häufig nicht erfüllt werden: (1) der Index ist numerisch (2) der Index beginnt bei Null (3) die Indexwerte sind aufeinanderfolgend ... der letzte ist besonders wichtig da Sie Ihre vorgeschlagene Methode nicht mehr als einmal verwenden können, ohne den Index zurückzusetzen
Constantine

1
Ich nehme deinen Punkt. Bearbeitet die Antwort, um die Annahmen deutlicher zu machen .
metastableB

1
@Constantine noch, wäre das nicht schneller als die andere Lösung, da Sie einfach einen Index hinzufügen können?
Readler

8

Es gibt eine noch einfachere Lösung für die akzeptierte Antwort, bei der direkt aufgerufen wird 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

Um beispielsweise alle 2 Zeilen zu erhalten, können Sie dies tun

df[::2]

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

Es gibt auch GroupBy.first/ GroupBy.head, Sie gruppieren im Index:

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

Der Index wird durch den Schritt (in diesem Fall 2) durch den Boden geteilt. Wenn der Index nicht numerisch ist, tun Sie dies stattdessen

# 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

Ich hatte eine ähnliche Anforderung, aber ich wollte den n-ten Punkt in einer bestimmten Gruppe. So habe ich es gelöst.

groups = data.groupby(['group_key'])
selection = groups['index_col'].apply(lambda x: x % 3 == 0)
subset = data[selection]
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.