Cara mendapatkan nilai dari Pandas DataFrame dan bukan indeks dan tipe objek

104

Katakanlah saya memiliki DataFrame berikut

Nomor Surat
A 1
B 2
C 3
D 4

Yang bisa didapat melalui kode berikut

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)

Sekarang saya ingin mendapatkan nilai C dari kolom Letters.

Baris perintah

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

akan kembali

2 C
Nama: Huruf, tipe: objek

Bagaimana saya bisa mendapatkan hanya nilai C dan bukan seluruh keluaran dua baris?

Eduardo
sumber
6
Pada catatan yang tidak terkait, ada cara yang lebih baik untuk menyusun DataFrame Anda:pd.DataFrame({'Letters': letters, 'Numbers': numbers})
JoeCondron

Jawaban:

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

Ini mengembalikan elemen pertama dalam Indeks / Seri yang dikembalikan dari pilihan itu. Dalam hal ini, nilainya selalu merupakan elemen pertama.

EDIT:

Atau Anda dapat menjalankan loc () dan mengakses elemen pertama dengan cara itu. Ini lebih pendek dan cara saya menerapkannya di masa lalu.

valkn0t.dll
sumber
2
Saya suka metode ini, namun saya mendapat peringatan:FutureWarning: "item" has been deprecated and will be removed in a future version
AlexG
2
@AlexG: Anda dapat menggunakan ini sebagai gantinya: df[df.Letters=='C'].Letters.iloc[0]. Ini menghasilkan elemen pertama (yang juga unik) dalam rangkaian hasil.
Anh-Thi DINH
menggunakan loc [: 1] masih menunjukkan indeks di sebelah nilai :(
Sonic Soul
@AlexG dan @Sonic Soul: coba gunakan df[df.Letters=='C'].Letters.squeeze()sebagai gantinya. Ini bekerja dengan cara yang sama. :)
user78910
52

Gunakan valuesatribut untuk mengembalikan nilai sebagai larik np dan kemudian gunakan [0]untuk mendapatkan nilai pertama:

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

Out[4]:
'C'

EDIT

Saya pribadi lebih suka mengakses kolom menggunakan operator subskrip:

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

Hal ini untuk menghindari masalah di mana nama kolom dapat memiliki spasi atau tanda hubung -yang berarti mengakses menggunakan ..

EdChum
sumber
1
Saya pribadi tidak menggunakan .untuk mengakses kolom karena ini tidak akan selalu berfungsi misalnya jika nama kolom dimulai dengan nilai numerik atau ada karakter non alfa seperti spasi di nama kolom jadi saya selalu lebih sukadf['col_name']
EdChum
Saya melihat. Itulah mengapa kemanapun saya melihat, saya selalu menemukan df['col_name']notasi, bukan .notasi. Terima kasih lagi.
Eduardo
1
Ini benar-benar tidak penting, tetapi dalam pilihan Anda, Anda mengakses kolom 'Letters' menggunakan notasi titik; df.loc [df.Letters == 'C']. Jika ada spasi di nama kolom Anda, Anda mungkin harus menggunakan konverter untuk menghapusnya, seperti yang Anda lakukan jika mengimpor dari file CSV atau Excel.
valkn0t
@ thomas-ato Saya akan memperbarui jawaban saya tetapi saya tidak setuju dengan memodifikasi kolom sebagai langkah tambahan kecuali jika diperlukan, dalam hal ini saya setuju tidak ada bedanya
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'

edit:

sebenarnya, Anda hanya dapat mengindeks dataset seperti array lama lainnya.

import pandas as pd

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

>>> print(first_value)
'item_0'
Lewis
sumber