Làm cách nào để có được N hàng cuối cùng của DataFrame?


175

Tôi có dataframe df1df2(df1 là vanila dataframe, df2 được lập chỉ mục bởi '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

Tôi có thể nhận được 3 hàng df2 cuối cùng bằng cách:

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

trong khi df1.ix[-3:]đưa ra tất cả các hàng:

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

Tại sao ? Làm cách nào để có được 3 hàng cuối cùng df1(khung dữ liệu không có chỉ mục)? Gấu trúc 0.10.1


3
Bạn có thể sử dụng df[-3:]để tạo ra kết quả mà bạn muốn. Điều này đã được giải quyết như là một lỗi của WesM. Không chắc chắn nếu / khi nó được sửa: stackoverflow.com/questions/14035817/ cấp
Zelazny7

@ Zelazny7 Tôi không nghĩ điều đó đúng. Tôi nghĩ rằng cắt lát tiêu cực ixlà một lỗi, nhưng chuyển các lát cắt âm sang __getitem__thì không. df.iloc[-3:]đại biểu nội bộ __getitem__với cùng một đối số, làm df[-3:]là một phím tắt cho df.iloc[-3:], không phải là một lỗi.
cs95

Câu trả lời:



74

Điều này là do sử dụng các chỉ số nguyên ( ixchọn các chỉ số theo nhãn trên -3 thay vì vị trí và đây là theo thiết kế: xem lập chỉ mục số nguyên trong gấu trúc "gotchas" *).

* Trong các phiên bản mới hơn của gấu trúc thích loc hoặc iloc để loại bỏ sự mơ hồ của ix là vị trí hoặc nhãn:

df.iloc[-3:]

xem các tài liệu .

Như Wes chỉ ra, trong trường hợp cụ thể này, bạn chỉ nên sử dụng đuôi!


1
@DavidWolever Tôi không thể sao chép IndexError của bạn vào 0.14.1, df.iloc [-5:] hoạt động tốt với tôi với ví dụ của bạn. Phiên bản nào của gấu trúc bạn đang sử dụng?
Andy Hayden

10

Làm cách nào để có được N hàng cuối cùng của DataFrame?

Nếu bạn cắt theo vị trí, __getitem__(nghĩa là cắt bằng []) hoạt động tốt và là giải pháp ngắn gọn nhất mà tôi đã tìm thấy cho vấn đề này.

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

Điều này cũng giống như gọi df.iloc[-3:], ví dụ ( ilocđại biểu nội bộ __getitem__).


Bên cạnh đó, nếu bạn muốn tìm N hàng cuối cùng cho mỗi nhóm, hãy sử dụng groupbyGroupBy.tail:

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

   A  B
1  a  2
2  a  3
5  b  6
6  b  7
7  c  8
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.