Untuk memilih ith
baris, gunakaniloc
:
In [31]: df_test.iloc[0]
Out[31]:
ATime 1.2
X 2.0
Y 15.0
Z 2.0
Btime 1.2
C 12.0
D 25.0
E 12.0
Name: 0, dtype: float64
Untuk memilih nilai engan di Btime
kolom yang dapat Anda gunakan:
In [30]: df_test['Btime'].iloc[0]
Out[30]: 1.2
Ada perbedaan antara df_test['Btime'].iloc[0]
(disarankan) dan df_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
mempengaruhi df_test
, tetapi df_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
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 ,
df.loc[df.index[n], 'Btime'] = x
atau
df.iloc[n, df.columns.get_loc('Btime')] = x
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 menggunakannya
df.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) sehingga df['Btime'].iloc[n] = x
dapat digunakan untuk menetapkan nilai baru di lokasi ke-n Btime
kolom df
.
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 memodifikasi df
:
In [22]: df = pd.DataFrame({'foo':list('ABC')}, index=[0,2,1])
In [24]: df['bar'] = 100
In [25]: df['bar'].iloc[0] = 99
/home/unutbu/data/binky/bin/ipython:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
self._setitem_with_indexer(indexer, value)
In [26]: df
Out[26]:
foo bar
0 A 99 <-- assignment succeeded
2 B 100
1 C 100
df.iloc[0]['Btime'] = x
tidak bekerja:
Sebaliknya, tugas dengan df.iloc[0]['bar'] = 123
tidak berfungsi karena df.iloc[0]
mengembalikan salinan:
In [66]: df.iloc[0]['bar'] = 123
/home/unutbu/data/binky/bin/ipython:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
In [67]: df
Out[67]:
foo bar
0 A 99 <-- assignment failed
2 B 100
1 C 100
Peringatan : Saya sebelumnya menyarankan df_test.ix[i, 'Btime']
. Tetapi ini tidak dijamin memberi Anda ith
nilai karena ix
mencoba mengindeks dengan label sebelum mencoba mengindeks berdasarkan posisi . Jadi jika DataFrame memiliki indeks integer yang tidak diurutkan mulai dari 0, maka menggunakan ix[i]
akan mengembalikan baris berlabel i
daripada ith
baris. Sebagai contoh,
In [1]: df = pd.DataFrame({'foo':list('ABC')}, index=[0,2,1])
In [2]: df
Out[2]:
foo
0 A
2 B
1 C
In [4]: df.ix[1, 'foo']
Out[4]: 'C'
df_test.head(1)
bekerja, bentuk yang lebih umum adalah menggunakaniloc
seperti yang dijawab oleh unutbu