Bagaimana cara mendapatkan baris N terakhir dari sebuah panda DataFrame?

175

Saya memiliki kerangka data panda df1dan df2( df1 adalah vanila dataframe, df2 diindeks oleh 'STK_ID' & 'RPT_Date'):

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

Saya bisa mendapatkan 3 baris terakhir df2 dengan:

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

sambil df1.ix[-3:]memberikan semua baris:

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

Mengapa Bagaimana cara mendapatkan 3 baris terakhir df1(dataframe tanpa indeks)? Panda 0.10.1

bigbug
sumber
3
Anda dapat menggunakan df[-3:]untuk menghasilkan hasil yang Anda inginkan. Ini diatasi sebagai bug oleh WesM. Tidak yakin apakah / ketika sudah diperbaiki: stackoverflow.com/questions/14035817/…
Zelazny7
@ Zelazny7 Saya pikir itu tidak benar. Saya pikir irisan negatif ixadalah bug, tetapi memberikan irisan negatif __getitem__tidak. df.iloc[-3:]Delegasi internal untuk __getitem__dengan argumen yang sama, lakukan df[-3:]adalah jalan pintas untuk df.iloc[-3:], bukan bug.
cs95

Jawaban:

394

Jangan lupa DataFrame.tail! misalnyadf1.tail(10)

Wes McKinney
sumber
Aku ... aku lupa: o
Mike Rapadas
74

Ini karena menggunakan indeks integer ( ixmemilih mereka dengan label lebih dari -3 daripada posisi , dan ini berdasarkan desain: lihat pengindeksan bilangan bulat di panda "gotcha" *).

* Dalam versi panda yang lebih baru lebih suka loc atau iloc untuk menghapus ambiguitas ix sebagai posisi atau label:

df.iloc[-3:]

lihat dokumen .

Seperti yang ditekankan oleh Wes, dalam kasus khusus ini Anda harus menggunakan ekor!

Andy Hayden
sumber
1
@ Davidvider Saya tidak bisa mereproduksi IndexError Anda di 0.14.1, df.iloc [-5:] berfungsi dengan baik untuk saya dengan contoh Anda. Versi panda mana yang Anda gunakan?
Andy Hayden
10

Bagaimana cara mendapatkan baris N terakhir dari sebuah panda DataFrame?

Jika Anda mengiris dengan posisi, __getitem__(yaitu, mengiris dengan []) berfungsi dengan baik, dan merupakan solusi paling ringkas yang saya temukan untuk masalah ini.

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

Ini sama dengan menelepon df.iloc[-3:], misalnya ( ilocdelegasi internal ke __getitem__).


Sebagai tambahan, jika Anda ingin menemukan baris N terakhir untuk setiap grup, gunakan groupbydan GroupBy.tail:

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

   A  B
1  a  2
2  a  3
5  b  6
6  b  7
7  c  8
cs95
sumber