Dataframe.resample () hanya berfungsi dengan data rangkaian waktu. Saya tidak dapat menemukan cara untuk mendapatkan setiap baris ke-n dari data non-deret waktu. Apa metode terbaik?
Jawaban:
Saya akan menggunakan iloc
, yang mengambil potongan baris / kolom, baik berdasarkan posisi integer dan mengikuti sintaks python normal.
df.iloc[::5, :]
df.iloc[::5]
Meskipun jawaban yang diterima @chrisb memang menjawab pertanyaan tersebut, saya ingin menambahkannya sebagai berikut.
Metode sederhana yang saya gunakan untuk mendapatkan nth
data atau menghapus nth
baris adalah sebagai berikut:
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
Pengambilan sampel berbasis aritmatika ini memiliki kemampuan untuk mengaktifkan pemilihan baris yang lebih kompleks.
Ini mengasumsikan , tentu saja, Anda memiliki index
kolom berurutan, berurutan, bilangan bulat mulai dari 0.
Ada solusi yang lebih sederhana untuk jawaban yang diterima yang melibatkan pemanggilan langsung 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
Misalnya, untuk mendapatkan setiap 2 baris, Anda bisa melakukannya
df[::2]
a b c
0 x x x
2 x x x
4 x x x
Ada juga GroupBy.first
/ GroupBy.head
, Anda mengelompokkan pada indeks:
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 lantai-divved oleh langkah (2, dalam kasus ini). Jika indeksnya non-numerik, lakukan saja
# 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, :]
.