Wie bekomme ich die letzten N Zeilen eines Pandas DataFrame?

175

Ich habe einen Pandas-Datenrahmen df1und df2(df1 ist ein Vanila-Datenrahmen, df2 ist durch 'STK_ID' & 'RPT_Date' indiziert):

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

Ich kann die letzten 3 Zeilen von df2 erhalten durch:

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

während df1.ix[-3:]alle Zeilen geben:

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

Warum ? Wie bekomme ich die letzten 3 Zeilen von df1(Datenrahmen ohne Index)? Pandas 0.10.1

großer Käfer
quelle
3
Sie können verwenden df[-3:], um die gewünschten Ergebnisse zu erzielen. Dies wurde von WesM als Fehler behoben. Nicht sicher, ob / wann es behoben wird: stackoverflow.com/questions/14035817/…
Zelazny7
@ Zelazny7 Ich denke nicht, dass das richtig ist. Ich denke, negatives Slicing mit ixwar ein Fehler, aber das Weitergeben von negativen Slices an __getitem__ist kein Fehler . df.iloc[-3:]intern delegiert an __getitem__mit den gleichen Argumenten, do df[-3:]ist eine Abkürzung für df.iloc[-3:], kein Fehler.
CS95

Antworten:

394

Vergiss nicht DataFrame.tail! z.Bdf1.tail(10)

Wes McKinney
quelle
Ich habe ... ich habe vergessen: o
Mike Rapadas
74

Dies liegt an der Verwendung von Ganzzahlindizes ( ixwählt diese nach Bezeichnung über -3 anstatt nach Position aus , und dies ist beabsichtigt : siehe Ganzzahlindizierung in Pandas "Fallstricke" *).

* In neueren Versionen von Pandas bevorzugen Sie loc oder iloc, um die Mehrdeutigkeit von ix als Position oder Bezeichnung zu beseitigen:

df.iloc[-3:]

Siehe die Dokumente .

Wie Wes betont, sollten Sie in diesem speziellen Fall nur den Schwanz verwenden!

Andy Hayden
quelle
1
@DavidWolever Ich kann Ihren IndexError auf 0.14.1 nicht reproduzieren. Df.iloc [-5:] funktioniert für mich mit Ihrem Beispiel einwandfrei. Welche Version von Pandas benutzt du?
Andy Hayden
10

Wie bekomme ich die letzten N Zeilen eines Pandas DataFrame?

Wenn Sie nach Position schneiden __getitem__(dh schneiden mit []), funktioniert dies gut und ist die prägnanteste Lösung, die ich für dieses Problem gefunden habe.

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

Dies entspricht beispielsweise dem Aufruf df.iloc[-3:]( ilocintern delegiert an __getitem__).


Wenn Sie außerdem die letzten N Zeilen für jede Gruppe suchen möchten, verwenden Sie groupbyund 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
quelle