Panda DataFrame'in son N satırı nasıl edinilir?


175

Pandalar veri çerçevesi var df1ve df2(df1 vanila veri çerçevesi, df2 'STK_ID' & 'RPT_Date' ile dizinlenir):

>>> df1
    STK_ID  RPT_Date  TClose   sales  discount
0   000568  20060331    3.69   5.975       NaN
1   000568  20060630    9.14  10.143       NaN
2   000568  20060930    9.49  13.854       NaN
3   000568  20061231   15.84  19.262       NaN
4   000568  20070331   17.00   6.803       NaN
5   000568  20070630   26.31  12.940       NaN
6   000568  20070930   39.12  19.977       NaN
7   000568  20071231   45.94  29.269       NaN
8   000568  20080331   38.75  12.668       NaN
9   000568  20080630   30.09  21.102       NaN
10  000568  20080930   26.00  30.769       NaN

>>> df2
                 TClose   sales  discount  net_sales    cogs
STK_ID RPT_Date                                             
000568 20060331    3.69   5.975       NaN      5.975   2.591
       20060630    9.14  10.143       NaN     10.143   4.363
       20060930    9.49  13.854       NaN     13.854   5.901
       20061231   15.84  19.262       NaN     19.262   8.407
       20070331   17.00   6.803       NaN      6.803   2.815
       20070630   26.31  12.940       NaN     12.940   5.418
       20070930   39.12  19.977       NaN     19.977   8.452
       20071231   45.94  29.269       NaN     29.269  12.606
       20080331   38.75  12.668       NaN     12.668   3.958
       20080630   30.09  21.102       NaN     21.102   7.431

Ben df2 son 3 satır alabilirsiniz:

>>> df2.ix[-3:]
                 TClose   sales  discount  net_sales    cogs
STK_ID RPT_Date                                             
000568 20071231   45.94  29.269       NaN     29.269  12.606
       20080331   38.75  12.668       NaN     12.668   3.958
       20080630   30.09  21.102       NaN     21.102   7.431

df1.ix[-3:]tüm satırları verirken :

>>> df1.ix[-3:]
    STK_ID  RPT_Date  TClose   sales  discount
0   000568  20060331    3.69   5.975       NaN
1   000568  20060630    9.14  10.143       NaN
2   000568  20060930    9.49  13.854       NaN
3   000568  20061231   15.84  19.262       NaN
4   000568  20070331   17.00   6.803       NaN
5   000568  20070630   26.31  12.940       NaN
6   000568  20070930   39.12  19.977       NaN
7   000568  20071231   45.94  29.269       NaN
8   000568  20080331   38.75  12.668       NaN
9   000568  20080630   30.09  21.102       NaN
10  000568  20080930   26.00  30.769       NaN

Neden ? Son 3 satırı nasıl alırsınız df1(dizinsiz veri çerçevesi)? Pandalar 0.10.1


3
İstediğiniz df[-3:]sonuçları üretmek için kullanabilirsiniz . Bu WesM tarafından bir hata olarak ele alındı. Sabitlendiğinden / düzeltildiğinden emin değilim: stackoverflow.com/questions/14035817/…
Zelazny7

@ Zelazny7 Bunun doğru olduğunu düşünmüyorum. Ben negatif dilimleme ile ixbir hata olduğunu düşünüyorum , ama negatif dilimleri geçen __getitem__değil. df.iloc[-3:]dahili __getitem__olarak aynı argümanlar ile delege yapar df[-3:], df.iloc[-3:]bir hata için değil , bir kısayol .
cs95

Yanıtlar:



74

Bunun nedeni tamsayı indeksleri kullanmaktır ( konumdan ziyade -3'ten fazla etiketeix göre seçer ve bu tasarımdan kaynaklanır: pandalar "gotchas" * 'da tamsayı indekslemeye bakın ).

* Pandaların daha yeni sürümlerinde, ix'in konum veya etiket olarak belirsizliğini kaldırmak için loc veya iloc'u tercih edin:

df.iloc[-3:]

belgelere bakın .

Wes'in belirttiği gibi, bu özel durumda sadece kuyruk kullanmalısınız!


1
@DavidWolever IndexError'ınızı 0.14.1'de yeniden oluşturamıyorum, df.iloc [-5:] örneğinizle benim için iyi çalışıyor. Hangi panda sürümünü kullanıyorsunuz?
Andy Hayden

10

Panda DataFrame'in son N satırı nasıl edinilir?

Pozisyona göre dilimleme yapıyorsanız __getitem__(yani dilimleme ile []) iyi çalışır ve bu sorun için bulduğum en özlü çözümdür.

pd.__version__
# '0.24.2'

df = pd.DataFrame({'A': list('aaabbbbc'), 'B': np.arange(1, 9)})
df

   A  B
0  a  1
1  a  2
2  a  3
3  b  4
4  b  5
5  b  6
6  b  7
7  c  8

df[-3:]

   A  B
5  b  6
6  b  7
7  c  8

Bu, df.iloc[-3:]örneğin çağrı ile aynıdır ( ilocdahili olarak delege olur __getitem__).


Bir kenara olarak, her bir grup, kullanıma son N satır bulmak istiyorsanız groupbyve GroupBy.tail:

df.groupby('A').tail(2)

   A  B
1  a  2
2  a  3
5  b  6
6  b  7
7  c  8
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.