Panda di setiap baris ke-n


109

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:


203

Saya akan menggunakan iloc, yang mengambil potongan baris / kolom, baik berdasarkan posisi integer dan mengikuti sintaks python normal.

df.iloc[::5, :]

46
Bagi mereka yang mungkin ingin, misalnya, setiap baris kelima, tetapi mulai dari baris ke-2 akan jadi df.iloc[1::5, :].
Little Bobby Tables

17
Anda dapat menghilangkan bagian kolom:df.iloc[::5]
joctee

1
@ Chrisb bagaimana cara menentukan baris awal? seperti setiap 5 baris, mulai dari baris kedua?
FabioSpaghetti

30

Meskipun jawaban yang diterima @chrisb memang menjawab pertanyaan tersebut, saya ingin menambahkannya sebagai berikut.

Metode sederhana yang saya gunakan untuk mendapatkan nthdata atau menghapus nthbaris 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 indexkolom berurutan, berurutan, bilangan bulat mulai dari 0.


6
ini bukan jawaban yang baik karena membuat tiga asumsi, yang sering tidak terpenuhi: (1) indeksnya numerik (2) indeks dimulai dari nol (3) nilai indeks berurutan ... yang terakhir sangat penting karena Anda tidak dapat menggunakan metode yang disarankan lebih dari sekali tanpa menyetel ulang indeks
Constantine

1
Aku mengerti maksudmu. Akan mengedit jawaban untuk membuat asumsi lebih eksplisit .
MetastableB

1
@Constantine lagi, bukankah itu lebih cepat daripada solusi lain karena Anda cukup menambahkan indeks?
Pembaca

8

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

1

Saya memiliki persyaratan yang serupa, tetapi saya ingin item ke-n dalam grup tertentu. Beginilah cara saya menyelesaikannya.

groups = data.groupby(['group_key'])
selection = groups['index_col'].apply(lambda x: x % 3 == 0)
subset = data[selection]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.