Truy cập chỉ mục của phần tử cuối cùng trong khung dữ liệu


83

Tôi đã tìm kiếm thứ này nhưng dường như không thể tìm thấy nó (mặc dù nó phải cực kỳ tầm thường).

Vấn đề mà tôi gặp phải là tôi muốn truy xuất giá trị của một cột cho các mục nhập đầu tiên và cuối cùng của khung dữ liệu. Nhưng nếu tôi làm:

df.ix[0]['date']

Tôi có:

datetime.datetime(2011, 1, 10, 16, 0)

nhưng nếu tôi làm:

df[-1:]['date']

Tôi có:

myIndex
13         2011-12-20 16:00:00
Name: mydate

với một định dạng khác. Lý tưởng nhất là tôi muốn có thể truy cập giá trị của chỉ mục cuối cùng của khung dữ liệu, nhưng tôi không thể tìm thấy cách nào.

Tôi thậm chí đã cố gắng tạo một cột (IndexCopy) với các giá trị của chỉ mục và thử:

df.ix[df.tail(1)['IndexCopy']]['mydate']

nhưng điều này cũng tạo ra một định dạng khác (vì df.tail (1) ['IndexCopy'] không xuất ra một số nguyên đơn giản).

Có ý kiến ​​gì không?

Câu trả lời:


129

Câu trả lời trước đây giờ được thay thế bằng .iloc:

>>> df = pd.DataFrame({"date": range(10, 64, 8)})
>>> df.index += 17
>>> df
    date
17    10
18    18
19    26
20    34
21    42
22    50
23    58
>>> df["date"].iloc[0]
10
>>> df["date"].iloc[-1]
58

Cách ngắn nhất mà tôi có thể nghĩ về cách sử dụng .iget():

>>> df = pd.DataFrame({"date": range(10, 64, 8)})
>>> df.index += 17
>>> df
    date
17    10
18    18
19    26
20    34
21    42
22    50
23    58
>>> df['date'].iget(0)
10
>>> df['date'].iget(-1)
58

Ngoài ra:

>>> df['date'][df.index[0]]
10
>>> df['date'][df.index[-1]]
58

Ngoài ra còn có .first_valid_index().last_valid_index(), nhưng tùy thuộc vào việc bạn có muốn loại trừ NaNchúng hay không mà chúng có thể không phải là những gì bạn muốn.

Hãy nhớ rằng điều df.ix[0]đó không cung cấp cho bạn cái đầu tiên, nhưng cái được lập chỉ mục bằng 0. Ví dụ, trong trường hợp trên, df.ix[0]sẽ tạo ra

>>> df.ix[0]
Traceback (most recent call last):
  File "<ipython-input-489-494245247e87>", line 1, in <module>
    df.ix[0]
[...]
KeyError: 0

cảm ơn câu trả lời của bạn. Tuy nhiên, tôi có một khung dữ liệu khác, trong đó df.ix [0] dường như cung cấp cho hàng đầu tiên của khung dữ liệu, mặc dù chỉ mục đầu tiên không phải là 0. Đặc biệt, kết quả của df.index [0] không phải là 0 , nhưng df.ix [df.index [0]] và df.ix [0] lại cho cùng một kết quả. Tại sao vậy?
elelias

Tôi cần xem chỉ mục, nhưng tôi nghi ngờ đó là vì chỉ mục không phải là số, trong trường hợp đó việc truy cập bằng số nguyên có thể hoạt động giống như chỉ mục chứ không phải khóa. Điều này là do không có sự mơ hồ trong những gì bạn yêu cầu nếu bạn yêu cầu Something(["A", "B", "C"])[1], nhưng bạn muốn gì nếu bạn có Something([1,2,3,4])[1]? Đọc các phần khác nhau ở đây trong tài liệu về một số vấn đề đau đầu liên quan.
DSM

Làm cách nào để sử dụng df ['xxx'] [df.index [0]] cho một float? Tôi có một phao 56,7888 và nó chuyển thành 56 thay vì 57
lvthillo

1
Gọi iget()cho 'Series' object has no attribute 'iget'.
Suzana

15

Kết hợp câu trả lời của @ comte và câu trả lời của dmdip trong Nhận chỉ mục của một hàng khung dữ liệu gấu trúc dưới dạng số nguyên

df.tail(1).index.item()

cung cấp cho bạn giá trị của chỉ mục.


Lưu ý rằng các chỉ số không phải lúc nào cũng được xác định rõ ràng cho dù chúng được lập chỉ mục nhiều hay không. Việc sửa đổi khung dữ liệu bằng cách sử dụng các chỉ số có thể dẫn đến hành vi không mong muốn. Chúng ta sẽ có một ví dụ với trường hợp nhiều chỉ mục nhưng lưu ý điều này cũng đúng trong trường hợp được lập chỉ mục đơn .

Nói rằng chúng tôi có

df = pd.DataFrame({'x':[1,1,3,3], 'y':[3,3,5,5]}, index=[11,11,12,12]).stack()

11  x    1
    y    3
    x    1
    y    3
12  x    3
    y    5              # the index is (12, 'y')
    x    3
    y    5              # the index is also (12, 'y')

df.tail(1).index.item() # gives (12, 'y')

Cố gắng truy cập vào phần tử cuối cùng với chỉ mục df[12, "y"]sẽ mang lại kết quả

(12, y)    5
(12, y)    5
dtype: int64

Nếu bạn cố gắng sửa đổi khung dữ liệu dựa trên chỉ mục (12, y), bạn sẽ sửa đổi hai hàng thay vì một hàng. Vì vậy, mặc dù chúng ta đã học cách truy cập giá trị của chỉ mục của hàng cuối cùng, nhưng có thể không phải là một ý kiến ​​hay nếu bạn muốn thay đổi các giá trị của hàng cuối cùng dựa trên chỉ mục của nó vì có thể có nhiều người chia sẻ cùng một chỉ mục. Tuy nhiên, bạn nên sử dụng df.iloc[-1]để truy cập hàng cuối cùng trong trường hợp này.

Tài liệu tham khảo

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Index.item.html


7
df.tail(1).index 

có vẻ dễ đọc nhất


Điều này không trả về một số mà là: RangeIndex (start = 6, stop = 7, step = 1)
alexandergs

5
alex: từ giá trị trả về index, start=6biểu thị phần bù của phần tử cuối cùng. Vì vậy, df.tail(1)được yếu tố cuối cùng, df["your_column"][6]sẽ là yếu tố cuối cùng, cho your_column, vv (nhưng df.last_valid_index()mang đến cho bạn chỉ số)
michael

2

Bây giờ có thể đã quá muộn, tôi sử dụng indexphương pháp để truy xuất chỉ mục cuối cùng của DataFrame, sau đó sử dụng [-1]để lấy các giá trị cuối cùng:

Ví dụ,

df = pd.DataFrame(np.zeros((4, 1)), columns=['A'])
print(f'df:\n{df}\n')

print(f'Index = {df.index}\n')
print(f'Last index = {df.index[-1]}')

Đầu ra là

df:
     A
0  0.0
1  0.0
2  0.0
3  0.0

Index = RangeIndex(start=0, stop=4, step=1)

Last index = 3

2

Bạn muốn .iloc có dấu ngoặc kép.

import pandas as pd
df = pd.DataFrame({"date": range(10, 64, 8), "not_date": "fools"})
df.index += 17
df.iloc[[0,-1]][['date']]

Bạn cung cấp cho .iloc một danh sách các chỉ mục - cụ thể là chỉ mục đầu tiên và cuối cùng, [0, -1]. Điều đó trả về khung dữ liệu mà bạn yêu cầu cột 'ngày tháng'. ['date'] sẽ cung cấp cho bạn một chuỗi ( yuck ) và [['date']] sẽ cung cấp cho bạn một khung dữ liệu.


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.