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?

Mixel
sumber

Jawaban:

203

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

df.iloc[::5, :]
chrisb
sumber
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.

metastabilB
sumber
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
cs95
sumber
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]
Steztric
sumber