Як отримати останні N рядків панд DataFrame?


175

У мене є фрейм даних панд, df1і df2(df1 - це ванільний кадр даних, 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


3
Ви можете використовувати df[-3:]для отримання бажаних результатів. Це вирішило WesM як помилку. Не впевнений , що якщо / коли вона стає фіксованою: stackoverflow.com/questions/14035817 / ...
Zelazny7

@ Zelazny7 Я не думаю, що це правильно. Я думаю, що негативні нарізки ixбули помилками, але передавати негативні фрагменти __getitem__- ні. df.iloc[-3:]внутрішньо делегується __getitem__тим самим аргументам, do df[-3:]- це ярлик для df.iloc[-3:], а не помилка.
cs95

Відповіді:



74

Це пов’язано з використанням цілих індексів ( ixвибирає їх за міткою понад -3, а не за позицією , і це за конструкцією: див. Індексацію цілих чисел у пандах "gotchas" *).

* У нових версіях панд віддають перевагу loc або iloc, щоб усунути неоднозначність ix як позиції чи мітки:

df.iloc[-3:]

дивись документи .

Як вказує Уес, у цьому конкретному випадку вам слід просто використовувати хвіст!


1
@DavidWolever Я не можу відтворити ваш IndexError на 0.14.1, df.iloc [-5:] добре працює для мене з вашим прикладом. Яку версію панд ви використовуєте?
Енді Хейден

10

Як отримати останні N рядків панд DataFrame?

Якщо ви нарізаєте за місцем __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

Це те саме, що дзвонити df.iloc[-3:], наприклад ( ilocвнутрішньо делегується __getitem__).


Якщо ви хочете знайти останні N рядків для кожної групи, використовуйте groupbyта GroupBy.tail:

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

   A  B
1  a  2
2  a  3
5  b  6
6  b  7
7  c  8
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.