Ini sepertinya pertanyaan yang sangat mudah ... tapi saya tidak melihat jawaban mudah yang saya harapkan.
Jadi, bagaimana saya mendapatkan nilai di baris ke-n dari kolom yang diberikan di Panda? (Saya terutama tertarik pada baris pertama, tetapi akan tertarik pada praktik yang lebih umum juga).
Sebagai contoh, katakanlah saya ingin menarik nilai 1.2 dalam Btime sebagai variabel.
Apa cara yang tepat untuk melakukan ini?
df_test =
ATime X Y Z Btime C D E
0 1.2 2 15 2 1.2 12 25 12
1 1.4 3 12 1 1.3 13 22 11
2 1.5 1 10 6 1.4 11 20 16
3 1.6 2 9 10 1.7 12 29 12
4 1.9 1 1 9 1.9 11 21 19
5 2.0 0 0 0 2.0 8 10 11
6 2.4 0 0 0 2.4 10 12 15
df_test.head(1)
bekerja, bentuk yang lebih umum adalah menggunakaniloc
seperti yang dijawab oleh unutbu1.2
? atau Seri panjang 1 yang Anda dapatkandf_test.head(1)
, yang juga akan berisi indeks? Untuk mendapatkan nilai sajadf_test.head(1).item()
, atautolist()
kemudian iris.Jawaban:
Untuk memilih
ith
baris, gunakaniloc
:Untuk memilih nilai engan di
Btime
kolom yang dapat Anda gunakan:Ada perbedaan antara
df_test['Btime'].iloc[0]
(disarankan) dandf_test.iloc[0]['Btime']
:DataFrames menyimpan data dalam blok berbasis kolom (di mana setiap blok memiliki dtype tunggal). Jika Anda memilih berdasarkan kolom terlebih dahulu, tampilan dapat dikembalikan (yang lebih cepat daripada mengembalikan salinan) dan tipe asli dipertahankan. Sebaliknya, jika Anda memilih berdasarkan baris terlebih dahulu, dan jika DataFrame memiliki kolom dengan tipe yang berbeda, maka Pandas menyalin data ke dalam Seri objek objek yang baru. Jadi memilih kolom sedikit lebih cepat daripada memilih baris. Jadi, meskipun
df_test.iloc[0]['Btime']
berfungsi,df_test['Btime'].iloc[0]
sedikit lebih efisien.Ada perbedaan besar antara keduanya dalam hal penugasan.
df_test['Btime'].iloc[0] = x
mempengaruhidf_test
, tetapidf_test.iloc[0]['Btime']
mungkin tidak. Lihat di bawah untuk penjelasan mengapa. Karena perbedaan halus dalam urutan pengindeksan membuat perbedaan besar dalam perilaku, lebih baik menggunakan tugas pengindeksan tunggal:df.iloc[0, df.columns.get_loc('Btime')] = x
(disarankan):Cara yang disarankan untuk menetapkan nilai baru ke DataFrame adalah untuk menghindari pengindeksan berantai , dan alih-alih menggunakan metode yang ditunjukkan oleh andrew ,
atau
Metode yang terakhir ini sedikit lebih cepat, karena
df.loc
harus mengonversi label baris dan kolom ke indeks posisi, jadi ada sedikit konversi yang diperlukan jika Anda menggunakannyadf.iloc
.df['Btime'].iloc[0] = x
berfungsi, tetapi tidak disarankan:Meskipun ini berfungsi, ini mengambil keuntungan dari cara DataFrames saat ini diterapkan. Tidak ada jaminan bahwa Panda harus bekerja seperti ini di masa depan. Secara khusus, ia mengambil keuntungan dari fakta bahwa (saat ini)
df['Btime']
selalu mengembalikan tampilan (bukan salinan) sehinggadf['Btime'].iloc[n] = x
dapat digunakan untuk menetapkan nilai baru di lokasi ke-nBtime
kolomdf
.Karena Pandas tidak membuat jaminan eksplisit tentang kapan pengindeks mengembalikan tampilan versus salinan, tugas yang menggunakan pengindeksan berantai umumnya selalu menaikkan
SettingWithCopyWarning
meskipun dalam kasus ini tugas berhasil memodifikasidf
:df.iloc[0]['Btime'] = x
tidak bekerja:Sebaliknya, tugas dengan
df.iloc[0]['bar'] = 123
tidak berfungsi karenadf.iloc[0]
mengembalikan salinan:Peringatan : Saya sebelumnya menyarankan
df_test.ix[i, 'Btime']
. Tetapi ini tidak dijamin memberi Andaith
nilai karenaix
mencoba mengindeks dengan label sebelum mencoba mengindeks berdasarkan posisi . Jadi jika DataFrame memiliki indeks integer yang tidak diurutkan mulai dari 0, maka menggunakanix[i]
akan mengembalikan baris berlabeli
daripadaith
baris. Sebagai contoh,sumber
df_test.iloc[0]['Btime']
berfungsi,df_test.iloc['Btime'][0]
sedikit lebih efisien.df['Btime'].iloc[0]
lebih disukaidf['Btime'].values[0]
? saya dapat melihat dari dokumentasi yang berbunyi "Peringatan: Kami sarankan menggunakan Series.array atau Series.to_numpy (), tergantung pada apakah Anda memerlukan referensi ke data yang mendasarinya atau array NumPy." tapi saya tidak yakin apa artinya ituPerhatikan bahwa jawaban dari @unutbu akan benar hingga Anda ingin menetapkan nilai ke sesuatu yang baru, maka itu tidak akan berfungsi jika dataframe Anda adalah tampilan.
Pendekatan lain yang secara konsisten akan bekerja dengan pengaturan dan pengambilan adalah:
sumber
Cara lain untuk melakukan ini:
Cara ini tampaknya lebih cepat daripada menggunakan
.iloc
:sumber
df.iloc[0].head(1)
- Kumpulan data pertama hanya dari seluruh baris pertama.df.iloc[0]
- Seluruh baris pertama di kolom.sumber
Secara umum, jika Anda ingin mengambil baris N pertama dari kolom J dari
pandas dataframe
cara terbaik untuk melakukan ini adalah:sumber
Untuk mendapatkan misalnya nilai dari kolom 'test' dan baris 1 berfungsi seperti itu
karena hanya
df[['test']].values[0]
mengembalikan arraysumber
Cara lain untuk mendapatkan baris pertama dan mempertahankan indeks:
sumber