Как получить последние N строк фрейма данных pandas?

У меня есть pandas dataframe df1 и df2 (df1 - это vanila dataframe, df2 индексируется '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

Я могу получить последние 3 строки df2:

>>> 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:] - все строки:

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

Почему ? Как получить последние 3 строки df1 (фрейм данных без индекса)? Панды 0.10.1


person bigbug    schedule 02.02.2013    source источник
comment
Вы можете использовать df[-3:] для получения желаемых результатов. WesM решил, что это ошибка. Не уверен, что / когда это будет исправлено: stackoverflow.com/questions/14035817/   -  person Zelazny7    schedule 02.02.2013
comment
@ Zelazny7 Не думаю, что это правильно. Я думаю, что отрицательные срезы с ix были ошибкой, но передача отрицательных срезов в __getitem__ - нет. df.iloc[-3:] внутренне делегирует __getitem__ те же аргументы, do df[-3:] - это ярлык для df.iloc[-3:], а не ошибка.   -  person cs95    schedule 22.01.2019
comment
Помните, что ix испражняется.   -  person MSIS    schedule 03.12.2020


Ответы (3)


Не забывай DataFrame.tail! например df1.tail(10)

person Wes McKinney    schedule 07.02.2013
comment
Я ... я забыл: o - person Mike Rapadas; 01.07.2020

Это из-за использования целочисленных индексов (ix выбирает их по метке больше -3, а не по позиции, и это сделано намеренно: см. целочисленное индексирование в pandas" gotchas " *).

* В более новых версиях pandas предпочитают loc или iloc, чтобы убрать двусмысленность ix как позиции или метки:

df.iloc[-3:]

см. документы.

Как указывает Уэс, в этом конкретном случае вы должны просто использовать tail!

person Andy Hayden    schedule 03.02.2013
comment
@DavidWolever Я не могу воспроизвести вашу IndexError на 0.14.1, df.iloc [-5:] отлично подходит для меня с вашим примером. Какую версию панд вы используете? - person Andy Hayden; 13.09.2014

Как получить последние N строк фрейма данных pandas?

Если вы выполняете нарезку по позиции, __getitem__ (т.е. нарезка с помощью[]) работает хорошо и является наиболее лаконичным решением, которое я нашел для этой проблемы.

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

This is the same as calling df.iloc[-3:], for instance (iloc internally delegates to __getitem__).


Кроме того, если вы хотите найти последние N строк для каждой группы, используйте _ 8_ и GroupBy.tail:

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

   A  B
1  a  2
2  a  3
5  b  6
6  b  7
7  c  8
person cs95    schedule 22.01.2019