Saya tahu ini adalah pertanyaan yang sangat mendasar tetapi untuk beberapa alasan saya tidak dapat menemukan jawaban. Bagaimana saya bisa mendapatkan indeks elemen tertentu dari Seri di python panda? (Kejadian pertama sudah cukup)
Yaitu, saya ingin sesuatu seperti:
import pandas as pd
myseries = pd.Series([1,4,0,7,5], index=[0,1,2,3,4])
print myseries.find(7) # should output 3
Tentu saja, dimungkinkan untuk mendefinisikan metode seperti itu dengan sebuah loop:
def find(s, el):
for i in s.index:
if s[i] == el:
return i
return None
print find(myseries, 7)
tapi saya berasumsi harus ada cara yang lebih baik. Disana?
Konversi ke Indeks, dapat Anda gunakan
get_loc
Penanganan duplikat
Akan mengembalikan array boolean jika pengembalian tidak bersebelahan
Menggunakan hashtable secara internal, sangat cepat
Seperti yang ditunjukkan Viktor, ada overhead penciptaan satu kali untuk membuat indeks (terjadi ketika Anda benar-benar MELAKUKAN sesuatu dengan indeks, misalnya
is_unique
)sumber
s.index[_]
Ini berfungsi jika Anda tahu 7 ada di muka. Anda dapat memeriksa ini dengan (myseries == 7) .any ()
Pendekatan lain (sangat mirip dengan jawaban pertama) yang juga mencakup beberapa 7 (atau tidak ada) adalah
sumber
any
cek tidak ideal karena iterasi ganda diperlukan. Ada pemeriksaan op pos keren yang akan mengungkap semuaFalse
kondisi yang dapat Anda lihat di sini .argmax
masih akan mengembalikan 0 (bukannya kesalahan keluar).Saya terkesan dengan semua jawaban di sini. Ini bukan jawaban baru, hanya upaya untuk meringkas penentuan waktu semua metode ini. Saya mempertimbangkan kasus seri dengan 25 elemen dan mengasumsikan kasus umum di mana indeks dapat berisi nilai apa pun dan Anda menginginkan nilai indeks yang sesuai dengan nilai pencarian yang menjelang akhir seri.
Berikut adalah tes kecepatan pada MacBook Pro 2013 di Python 3.7 dengan Pandas versi 0.25.3.
@ Jeff menjawab sepertinya yang tercepat - meskipun tidak menangani duplikat.
Koreksi : Maaf, saya melewatkan satu, solusi @Alex Spangher menggunakan metode daftar indeks sejauh ini tercepat.
Pembaruan : Menambahkan jawaban @ EliadL.
Semoga ini membantu.
Luar biasa bahwa operasi yang begitu sederhana membutuhkan solusi berbelit-belit dan banyak yang sangat lambat. Lebih dari setengah milidetik dalam beberapa kasus menemukan nilai dalam serangkaian 25.
sumber
myindex
dibuat, karena itu hanya perlu dibuat sekali?myindex
seri jika ingin melakukan pencarian berulang kali. Untuk tes ini saya berasumsi itu hanya diperlukan sekali dan waktu eksekusi total adalah penting.pd.Index(myseries)
. Agar adil dengan metode lain saya berasumsi seri asli mungkin telah berubah sejak pencarian terakhir.Cara lain untuk melakukan ini, meskipun sama-sama tidak memuaskan adalah:
pengembalian: 3
Pada tes waktu menggunakan dataset saat ini saya bekerja dengan (menganggapnya acak):
sumber
Jika Anda menggunakan numpy, Anda bisa mendapatkan array dari indecies yang nilainya ditemukan:
Ini mengembalikan satu elemen tuple yang berisi array dari indecies di mana 7 adalah nilai di myseries:
sumber
Anda dapat menggunakan Series.idxmax ()
sumber
index of certain element
seperti pertanyaan yang diajukan.Cara lain untuk melakukannya yang belum disebutkan adalah metode tolist:
harus mengembalikan indeks yang benar, dengan asumsi nilai ada di Seri.
sumber
Seringkali nilai Anda muncul di beberapa indeks:
sumber
Ini adalah pendekatan paling asli dan terukur yang bisa saya temukan:
sumber