Cách lấy giá trị từ Pandas DataFrame chứ không phải chỉ mục và loại đối tượng


104

Giả sử tôi có DataFrame sau

Số thư
A 1
B 2
C 3
D 4

Có thể lấy được thông qua đoạn mã sau

import pandas as pd

letters=pd.Series(('A', 'B', 'C', 'D'))
numbers=pd.Series((1, 2, 3, 4))
keys=('Letters', 'Numbers')
df=pd.concat((letters, numbers), axis=1, keys=keys)

Bây giờ tôi muốn lấy giá trị C từ cột Chữ cái.

Dòng lệnh

df[df.Letters=='C'].Letters

sẽ trở lại

2 C
Tên: Chữ cái, loại: đối tượng

Làm thế nào tôi có thể chỉ nhận được giá trị C chứ không phải toàn bộ đầu ra hai dòng?


6
Trên một ghi chú không liên quan, có một cách tốt hơn để cấu trúc DataFrame của bạn:pd.DataFrame({'Letters': letters, 'Numbers': numbers})
JoeCondron

Câu trả lời:


144
df[df.Letters=='C'].Letters.item()

Điều này trả về phần tử đầu tiên trong Chỉ mục / Chuỗi được trả về từ lựa chọn đó. Trong trường hợp này, giá trị luôn là phần tử đầu tiên.

BIÊN TẬP:

Hoặc bạn có thể chạy loc () và truy cập phần tử đầu tiên theo cách đó. Điều này ngắn hơn và là cách tôi đã thực hiện nó trong quá khứ.


2
Tôi yêu phương pháp này, tuy nhiên tôi nhận được cảnh báo:FutureWarning: "item" has been deprecated and will be removed in a future version
AlexG

2
@AlexG: bạn có thể sử dụng thay vì: df[df.Letters=='C'].Letters.iloc[0]. Nó tạo ra phần tử đầu tiên (cũng là phần tử duy nhất) trong chuỗi kết quả.
Anh-Thi DINH

sử dụng loc [: 1] vẫn hiển thị chỉ mục bên cạnh giá trị :(
Sonic Soul

@AlexG và @Sonic Soul: hãy thử sử dụng df[df.Letters=='C'].Letters.squeeze()thay thế. Điều này hoạt động theo cùng một cách. :)
user78910

52

Sử dụng valuesthuộc tính để trả về các giá trị dưới dạng một mảng np và sau đó sử dụng [0]để nhận giá trị đầu tiên:

In [4]:
df.loc[df.Letters=='C','Letters'].values[0]

Out[4]:
'C'

BIÊN TẬP

Cá nhân tôi thích truy cập các cột bằng toán tử chỉ số con:

df.loc[df['Letters'] == 'C', 'Letters'].values[0]

Điều này tránh các vấn đề trong đó tên cột có thể có dấu cách hoặc dấu gạch ngang -có nghĩa là truy cập bằng cách sử dụng ..


1
Cá nhân tôi không sử dụng .để truy cập các cột vì điều này sẽ không phải lúc nào cũng hoạt động, chẳng hạn như nếu tên cột bắt đầu bằng giá trị số hoặc có các ký tự không phải chữ cái, chẳng hạn như khoảng df['col_name']
trắng

Tôi hiểu rồi. Đó là lý do tại sao ở mọi nơi tôi nhìn, tôi luôn tìm thấy df['col_name']ký hiệu thay vì .ký hiệu. Cảm ơn một lần nữa.
Eduardo

1
Nó thực sự không quan trọng, nhưng trong lựa chọn của bạn, bạn truy cập cột 'Chữ cái' bằng cách sử dụng ký hiệu dấu chấm; df.loc [df.Letters == 'C']. Nếu có khoảng trắng trong tên cột của bạn, có lẽ bạn nên sử dụng trình chuyển đổi để loại bỏ những khoảng trắng đó, giống như cách bạn nhập từ tệp CSV hoặc Excel.
valkn0t

@ thomas-ato tôi sẽ cập nhật câu trả lời của tôi, nhưng tôi không đồng ý với modding các cột như một bước bổ sung trừ khi đó là cần thiết, trong trường hợp này tôi đồng ý nó làm cho không có sự khác biệt
EdChum

1
import pandas as pd

dataset = pd.read_csv("data.csv")
values = list(x for x in dataset["column name"])

>>> values[0]
'item_0'

biên tập:

thực ra, bạn chỉ có thể lập chỉ mục tập dữ liệu giống như bất kỳ mảng cũ nào.

import pandas as pd

dataset = pd.read_csv("data.csv")
first_value = dataset["column name"][0]

>>> print(first_value)
'item_0'
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.