Pandalar veri çerçevesinin son veri satırı nasıl silinir?


119

Bunun basit olması gerektiğini düşünüyorum, ancak birkaç fikir denedim ve hiçbiri işe yaramadı:

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

Negatif indeks kullanmayı denedim ama bu da hatalara neden oluyor. Hâlâ temel bir şeyi yanlış anlıyor olmalıyım.


30
DF = DF[:-1]?
U2EF1

@ U2EF1 bu, tüm veri kümesini kopyalar, değil mi? Büyük verileri işlerken bu bir sorun olabilir.
ManuelSchneid3r

Yanıtlar:


176

Son n satırı kaldırmak için:

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

Aynı şekilde, ilk n satırı bırakabilirsiniz:

df.drop(df.head(n).index,inplace=True) # drop first n rows

Son sütunu kaldırmak için df.drop (df.columns [-1], axis = 1, inplace = True) kullanabilir veya sütunun adını biliyorsanız, df.drop (sütunlar = ['sütun_adı '], inplace = True) - yerinde gerçekleştirilmesini istemiyorsanız, onu yeni bir değişkene atayın ve bu argümanı kaldırın.
Shawn Schreier

93
DF[:-n]

burada n, düşülecek son satır sayısıdır.

Son satırı bırakmak için:

DF = DF[:-1]

Basitlik için oy verildi
Seth

60

Python'da dizin konumlandırma 0 tabanlı olduğundan, indexkarşılık gelen konumda aslında bir öğe olmayacaktır len(DF). Bunun olması gerek 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]

Ancak, sadece yazmak çok daha basit DF[:-1].


2
Dfrm.index kullanılarak bırakılırken, son satırın dizininin benzersiz olması gerektiğini, aksi takdirde bu dizine sahip tüm satırların düşeceğini unutmayın.
FranciscoD

Drop (inplace = True) kullanarak mevcut df'yi değiştirdiğinizi, df [: - 1] kullanırken ise bir veri görünümü elde ettiğinizi doğru anlıyor muyum, bu daha sonra SettingWithCopyWarning'e yol açabilir?
Philipp

29

Şaşırdım kimse bunu açmadı:

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

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

1000 satırlık bir DataFrame üzerinde hız testi çalıştırmak, dilimlemenin ve head/ veya tailaşağıdakileri kullanmaktan ~ 6 kat daha hızlı olduğunu gösterir 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)

Belki de her iki yaklaşım arasındaki fark şudur head()ve tail()bir görünüm oluştururken , drop()aslında bellekteki gösterimi değiştirir (yerinde değişiklik veya tamamen yeni bir veri çerçevesi oluşturur). Buna belgelerde bakmadım, lütfen birisi baksın. (eğer fark buysa: performans farkı için iyi bir açıklama ve birinin dikkatlice aralarında seçim yapması gerekiyor) /
Dr.Jan-Philip Gehrcke

@ Dr.Jan-PhilipGehrcke Başkanı head, tailve droptüm dönüş bir görünüm, bu doğrudur rağmen dropsize orijinal dataframe INPLACE değiştirme seçeneği sunar.
theGirrafish

5
stats = pd.read_csv("C:\\py\\programs\\second pandas\\ex.csv")

İstatistiklerin Çıktısı:

       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

sadece kullan skipfooter=1

skipfooter: int, varsayılan 0

Dosyanın altındaki atlanacak satır sayısı

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

İstatistik_2 çıktısı

       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

1

drop yeni bir dizi döndürür, bu nedenle og postunda tıkanmıştır; Dataframe'e dönüştürülmüş kötü biçimlendirilmiş bir csv dosyası nedeniyle bazı sütun başlıklarını yeniden adlandırmak ve bazı satırları sildim, bu yüzden bu yazıyı okuduktan sonra kullandım:

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)

ve harika çalıştı, yukarıdaki iki açıklama satırıyla görebileceğiniz gibi drop. () yöntemini denedim ve işe yarıyor, ancak [n: -n] kullanmak kadar okunaklı değil, umarım birine yardımcı olur, teşekkürler.


0

Çoklu Dizini olan ("Stok" ve "Tarih" diyelim) ve biri son Stokun son satırı değil, her Hisse için son satırı kaldırmak isteyen daha karmaşık DataFrame'ler için, çözüm şunu okur:

# 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)

As groupby()Çoklu Endeksine ek bir seviyeye ekliyor biz sadece kullanılarak sonuna bırakırsanız reset_index(). Ortaya çıkan df, işlemden önceki ile aynı tür Çoklu Dizini korur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.