Cara menghapus baris terakhir data dari bingkai data panda

107

Saya pikir ini seharusnya sederhana, tetapi saya mencoba beberapa ide dan tidak ada yang berhasil:

last_row = len(DF)
DF = DF.drop(DF.index[last_row])  #<-- fail!

Saya mencoba menggunakan indeks negatif tetapi itu juga menyebabkan kesalahan. Saya pasti masih salah paham tentang sesuatu yang mendasar.

tumultous_rooster
sumber
27
DF = DF[:-1]?
U2EF1
@ U2EF1 ini menyalin seluruh dataset, bukan? Saat menangani data besar, ini mungkin menjadi masalah.
ManuelSchneid3r

Jawaban:

166

Untuk melepaskan n baris terakhir:

df.drop(df.tail(n).index,inplace=True) # drop last n rows

Dengan nada yang sama, Anda dapat melepaskan n baris pertama:

df.drop(df.head(n).index,inplace=True) # drop first n rows
Kane Chew
sumber
Untuk menghapus kolom terakhir Anda dapat menggunakan df.drop (df.columns [-1], axis = 1, inplace = True) atau, jika Anda mengetahui nama kolom Anda dapat menggunakan df.drop (kolom = ['col_name '], inplace = True) - jika Anda tidak ingin itu dilakukan pada tempatnya, tetapkan ke variabel baru dan hapus argumen itu.
Shawn Schreier
80
DF[:-n]

di mana n adalah jumlah baris terakhir untuk dijatuhkan.

Untuk menjatuhkan baris terakhir:

DF = DF[:-1]
langit biru
sumber
59

Karena pemosisian indeks dalam Python berbasis 0, sebenarnya tidak akan ada elemen di indexlokasi yang sesuai len(DF). Anda membutuhkannya untuk menjadi last_row = len(DF) - 1:

In [49]: dfrm
Out[49]: 
          A         B         C
0  0.120064  0.785538  0.465853
1  0.431655  0.436866  0.640136
2  0.445904  0.311565  0.934073
3  0.981609  0.695210  0.911697
4  0.008632  0.629269  0.226454
5  0.577577  0.467475  0.510031
6  0.580909  0.232846  0.271254
7  0.696596  0.362825  0.556433
8  0.738912  0.932779  0.029723
9  0.834706  0.002989  0.333436

[10 rows x 3 columns]

In [50]: dfrm.drop(dfrm.index[len(dfrm)-1])
Out[50]: 
          A         B         C
0  0.120064  0.785538  0.465853
1  0.431655  0.436866  0.640136
2  0.445904  0.311565  0.934073
3  0.981609  0.695210  0.911697
4  0.008632  0.629269  0.226454
5  0.577577  0.467475  0.510031
6  0.580909  0.232846  0.271254
7  0.696596  0.362825  0.556433
8  0.738912  0.932779  0.029723

[9 rows x 3 columns]

Namun, jauh lebih mudah untuk hanya menulis DF[:-1].

ely
sumber
2
Perhatikan bahwa saat menghapus menggunakan dfrm.index, indeks baris terakhir harus unik, jika tidak, semua baris dengan indeks tersebut akan dihapus.
FranciscoD
Apakah saya mengerti benar, bahwa dengan menggunakan drop (inplace = True) Anda memodifikasi df yang ada, sedangkan menggunakan df [: - 1] Anda mendapatkan tampilan data, yang nantinya dapat mengarah ke SettingWithCopyWarning?
Philipp
22

Terkejut tidak ada yang mengangkat yang ini:

# To remove last n rows
df.head(-n)

# To remove first n rows
df.tail(-n)

Menjalankan uji kecepatan pada DataFrame dari 1000 baris menunjukkan bahwa pemotongan dan head/ tail~ 6 kali lebih cepat daripada menggunakan drop:

>>> %timeit df[:-1]
125 µs ± 132 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

>>> %timeit df.head(-1)
129 µs ± 1.18 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

>>> %timeit df.drop(df.tail(1).index)
751 µs ± 20.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
theGirrafish
sumber
Mungkin perbedaan antara kedua pendekatan adalah itu head()dan tail()membuat tampilan sedangkan drop()sebenarnya mengubah representasi dalam memori (baik modifikasi di tempat, atau membuat kerangka data yang sama sekali baru). Saya tidak mencari ini di dokumen, seseorang tolong lakukan. (jika itu perbedaannya: penjelasan yang baik untuk perf diff, dan kita perlu hati-hati memilih di antara keduanya) /
Dr. Jan-Philip Gehrcke
@ Dr.Jan-PhilipGehrcke Head head, taildan dropsemua mengembalikan tampilan, meskipun itu benar dropmemberi Anda opsi untuk memodifikasi kerangka data asli di tempat.
theGirrafish
5
stats = pd.read_csv("C:\\py\\programs\\second pandas\\ex.csv")

Output dari statistik:

       A            B          C
0   0.120064    0.785538    0.465853
1   0.431655    0.436866    0.640136
2   0.445904    0.311565    0.934073
3   0.981609    0.695210    0.911697
4   0.008632    0.629269    0.226454
5   0.577577    0.467475    0.510031
6   0.580909    0.232846    0.271254
7   0.696596    0.362825    0.556433
8   0.738912    0.932779    0.029723
9   0.834706    0.002989    0.333436

gunakan saja skipfooter=1

skipfooter: int, default 0

Jumlah baris di bagian bawah file untuk dilewati

stats_2 = pd.read_csv("C:\\py\\programs\\second pandas\\ex.csv", skipfooter=1, engine='python')

Output dari stats_2

       A          B            C
0   0.120064    0.785538    0.465853
1   0.431655    0.436866    0.640136
2   0.445904    0.311565    0.934073
3   0.981609    0.695210    0.911697
4   0.008632    0.629269    0.226454
5   0.577577    0.467475    0.510031
6   0.580909    0.232846    0.271254
7   0.696596    0.362825    0.556433
8   0.738912    0.932779    0.029723
Riz.Khan
sumber
1

drop mengembalikan array baru sehingga tersedak dalam og post; Saya memiliki persyaratan serupa untuk mengganti nama beberapa tajuk kolom dan menghapus beberapa baris karena file csv yang rusak diubah menjadi Dataframe, jadi setelah membaca posting ini saya menggunakan:

newList = pd.DataFrame(newList)
newList.columns = ['Area', 'Price']
print(newList)
# newList = newList.drop(0)
# newList = newList.drop(len(newList))
newList = newList[1:-1]
print(newList)

dan itu bekerja dengan baik, seperti yang Anda lihat dengan dua baris yang dikomentari di atas saya mencoba metode drop. () dan berhasil tetapi tidak sekeren dan mudah dibaca seperti menggunakan [n: -n], semoga membantu seseorang, terima kasih.

Jam tayang utama
sumber
0

Untuk DataFrame yang lebih kompleks yang memiliki Multi-Indeks (katakanlah "Saham" dan "Tanggal") dan seseorang ingin menghapus baris terakhir untuk setiap Saham bukan hanya baris terakhir dari Saham terakhir, maka solusinya adalah:

# To remove last n rows
df = df.groupby(level='Stock').apply(lambda x: x.head(-1)).reset_index(0, drop=True)

# To remove first n rows
df = df.groupby(level='Stock').apply(lambda x: x.tail(-1)).reset_index(0, drop=True)

Karena groupby()menambahkan level tambahan ke Multi-Indeks, kami hanya menjatuhkannya di bagian akhir menggunakanreset_index() . Df yang dihasilkan mempertahankan tipe Multi-Indeks yang sama seperti sebelum operasi.

Dorian B.
sumber