Saya telah membuat DataFrame Pandas
df = DataFrame(index=['A','B','C'], columns=['x','y'])
dan dapatkan ini
xy A NaN NaN B NaN NaN C NaN NaN
Lalu saya ingin memberikan nilai ke sel tertentu, misalnya untuk baris 'C' dan kolom 'x'. Saya berharap mendapatkan hasil seperti itu:
xy A NaN NaN B NaN NaN C 10 NaN
dengan kode ini:
df.xs('C')['x'] = 10
tapi isinya df
belum berubah. Lagi-lagi hanya ada NaN
di DataFrame.
Ada saran?
df['x']['C']
), gunakandf.ix['x','C']
.dataframe[column (series)] [row (Series index)]
:, sedangkan banyak orang (termasuk saya) lebih terbiasa dengandataframe[row][column]
pesanan. Sebagai seorang programmer Matlab dan R, yang terakhir ini terasa lebih intuitif bagi saya tetapi ternyata itu bukan cara kerja Pandas ..Jawaban:
Jawaban RukTech ini ,
df.set_value('C', 'x', 10)
adalah jauh dan jauh lebih cepat daripada pilihan saya disarankan di bawah ini. Namun, telah dijadwalkan untuk penghentian .Ke depan, metode yang disarankan adalah
.iat/.at
.Mengapa
df.xs('C')['x']=10
tidak berfungsi:df.xs('C')
secara default, mengembalikan bingkai data baru dengan salinan data, jadimemodifikasi kerangka data baru ini saja.
df['x']
mengembalikan tampilan daridf
kerangka data, jadimemodifikasi
df
sendiri.Peringatan : Terkadang sulit untuk memprediksi apakah suatu operasi mengembalikan salinan atau tampilan. Untuk alasan ini, dokumen merekomendasikan menghindari tugas dengan "pengindeksan berantai" .
Jadi alternatif yang disarankan adalah
yang tidak memodifikasi
df
.sumber
df.x
di API . Apa yang kamu maksud?'x'
adalah nama kolom didf
.df.x
mengembalikan aSeries
dengan nilai-nilai di kolomx
. Saya akan mengubahnyadf['x']
karena notasi ini akan berfungsi dengan nama kolom apa pun (tidak seperti notasi titik) dan saya pikir lebih jelas.df.x
adalah beberapa metode baru yang tidak diketahui bersamadf.xs, df.ix
df.xs(..., copy=True)
mengembalikan salinan, dan itulah perilaku default.df.xs(..., copy=False)
mengembalikan yang asli.Pembaruan:
.set_value
Metode ini akan ditinggalkan ..iat/.at
adalah pengganti yang bagus, sayangnya panda menyediakan sedikit dokumentasiCara tercepat untuk melakukan ini adalah menggunakan set_value . Metode ini ~ 100 kali lebih cepat dari
.ix
metode. Sebagai contoh:df.set_value('C', 'x', 10)
sumber
df['x']['C'] = 10
.df=df.append(df.sum(numeric_only=True),ignore_index=True)
?Anda juga dapat menggunakan pencarian bersyarat menggunakan
.loc
seperti yang terlihat di sini:di mana
<some_column_name
kolom yang ingin Anda periksa<condition>
variabelnya dan<another_column_name>
merupakan kolom yang ingin Anda tambahkan (bisa berupa kolom baru atau yang sudah ada).<value_to_add>
adalah nilai yang ingin Anda tambahkan ke kolom / baris itu.Contoh ini tidak bekerja secara tepat dengan pertanyaan yang ada, tetapi mungkin berguna bagi seseorang yang ingin menambahkan nilai tertentu berdasarkan suatu kondisi.
sumber
df.loc[df['age']==3, ['age-group']] = 'toddler'
Cara yang disarankan (menurut pengelola) untuk menetapkan nilai adalah:
Menggunakan 'pengindeksan berantai' (
df['x']['C']
) dapat menyebabkan masalah.Lihat:
sumber
ix
sudah ditinggalkan: pandas-docs.github.io/pandas-docs-travis/…Coba gunakan
df.loc[row_index,col_indexer] = value
sumber
Ini adalah satu-satunya hal yang berhasil untuk saya!
Pelajari lebih lanjut di
.loc
sini .sumber
.loc
menggantikan.iat/.at
?at
Mirip dengan ituloc
, keduanya menyediakan pencarian berbasis label. Gunakanat
jika Anda hanya perlu mendapatkan atau menetapkan nilai tunggal dalam DataFrame atau Seri. Dari padas doc.iat/.at
adalah solusi yang bagus. Andaikata Anda memiliki data_frame sederhana ini:jika kita ingin memodifikasi nilai sel, kita
[0,"A"]
dapat menggunakan salah satu dari solusi tersebut:df.iat[0,0] = 2
df.at[0,'A'] = 2
Dan berikut ini adalah contoh lengkap cara menggunakan
iat
untuk mendapatkan dan menetapkan nilai sel:y_train sebelumnya:
y_train setelah memanggil fungsi prepossessing yang
iat
akan diubah untuk mengalikan nilai setiap sel dengan 2:sumber
Untuk menetapkan nilai, gunakan:
set_value
,ix
telah ditinggalkan.iloc
danloc
sumber
Anda dapat menggunakan
.iloc
.sumber
df.iloc[[2:8], [0]] = [2,3,4,5,6,7]
metode mana yangdf.loc()
dilakukan secara asli.Dalam contoh saya, saya hanya mengubahnya di sel yang dipilih
'result' adalah dataField dengan kolom 'weight'
sumber
set_value()
sudah ditinggalkan.Mulai dari rilis 0.23.4, Pandas " mengumumkan masa depan " ...
Mempertimbangkan saran ini, berikut ini adalah demonstrasi cara menggunakannya:
Referensi:
sumber
Berikut ini adalah ringkasan dari solusi valid yang disediakan oleh semua pengguna, untuk frame data yang diindeks oleh integer dan string.
df.iloc, df.loc dan df.at bekerja untuk kedua jenis frame data, df.iloc hanya bekerja dengan indeks integer baris / kolom, df.loc dan df.at mendukung untuk menetapkan nilai menggunakan nama kolom dan / atau indeks integer .
Ketika indeks yang ditentukan tidak ada, baik df.loc dan df.at akan menambahkan baris / kolom yang baru disisipkan ke bingkai data yang ada, tetapi df.iloc akan menaikkan "IndexError: pengindeksional posisi berada di luar batas". Contoh kerja yang diuji dengan Python 2.7 dan 3.7 adalah sebagai berikut:
sumber
Saya menguji dan hasilnya
df.set_value
sedikit lebih cepat, tetapi metode resmidf.at
sepertinya cara tercepat yang tidak ketinggalan untuk melakukannya.Perhatikan ini mengatur nilai untuk sel tunggal. Untuk vektor
loc
daniloc
harus menjadi pilihan yang lebih baik karena vektor.sumber
Salah satu cara untuk menggunakan indeks dengan kondisi adalah pertama-tama dapatkan indeks dari semua baris yang memenuhi kondisi Anda dan kemudian cukup gunakan indeks baris itu dalam berbagai cara
Contoh kondisi seperti
Kemudian Anda dapat menggunakan indeks baris ini dalam berbagai cara seperti
Ini semua dimungkinkan karena .index mengembalikan array indeks yang .loc dapat digunakan dengan pengalamatan langsung sehingga menghindari traversal lagi dan lagi.
sumber
df.loc['c','x']=10
Ini akan mengubah nilai dari baris ke- c dan kolom ke- x .sumber
Selain jawaban di atas, berikut ini adalah tolok ukur yang membandingkan berbagai cara untuk menambahkan baris data ke kerangka data yang sudah ada. Ini menunjukkan bahwa menggunakan at atau set-value adalah cara yang paling efisien untuk kerangka data yang besar (setidaknya untuk kondisi pengujian ini).
Untuk pengujian, digunakan kerangka data yang terdiri dari 100.000 baris dan 1.000 kolom dan nilai numpy acak. Untuk kerangka data ini, 100 baris baru ditambahkan.
Kode lihat di bawah:
sumber
Jika Anda ingin mengubah nilai bukan untuk seluruh baris, tetapi hanya untuk beberapa kolom:
sumber
Dari versi 0.21.1 Anda juga dapat menggunakan
.at
metode. Ada beberapa perbedaan dibandingkan dengan yang.loc
disebutkan di sini - panda. Pada versus .loc , tetapi lebih cepat pada penggantian nilai tunggalsumber
Soo, pertanyaan Anda untuk mengonversi NaN di ['x', C] ke nilai 10
jawabannya adalah..
kode alternatif adalah
sumber
Saya juga sedang mencari topik ini dan saya menyusun cara untuk beralih melalui DataFrame dan memperbaruinya dengan nilai pencarian dari DataFrame kedua. Ini kode saya.
sumber