Saya memiliki bingkai data panda yang terlihat seperti ini (ini yang cukup besar)
date exer exp ifor mat
1092 2014-03-17 American M 528.205 2014-04-19
1093 2014-03-17 American M 528.205 2014-04-19
1094 2014-03-17 American M 528.205 2014-04-19
1095 2014-03-17 American M 528.205 2014-04-19
1096 2014-03-17 American M 528.205 2014-05-17
sekarang saya ingin mengulang baris demi baris dan ketika saya melewati setiap baris, nilai dari ifor
setiap baris dapat berubah tergantung pada beberapa kondisi dan saya perlu mencari dataframe lain.
Sekarang, bagaimana saya memperbarui ini saat saya mengulanginya. Sudah mencoba beberapa hal yang tidak ada yang berhasil.
for i, row in df.iterrows():
if <something>:
row['ifor'] = x
else:
row['ifor'] = y
df.ix[i]['ifor'] = x
Tidak satu pun dari pendekatan ini yang berhasil. Saya tidak melihat nilai-nilai diperbarui dalam kerangka data.
df.ix[i,'ifor']
.df.ix[i]['ifor']
bermasalah karena itu dirantai pengindeksan (yang tidak dapat diandalkan dalam panda).<something>
. Apakah kode Anda dapat di-vektor-kan tergantung pada hal-hal itu. Secara umum, hindariiterrows
. Dalam kasus Anda, Anda pasti harus menghindarinya karena setiap baris akan menjadiobject
dtypeSeries
.Jawaban:
Anda dapat menetapkan nilai dalam loop menggunakan df.set_value:
Jika Anda tidak membutuhkan nilai-nilai baris, Anda cukup mengulangi indeks df, tetapi saya menyimpan yang asli untuk-loop jika Anda membutuhkan nilai baris untuk sesuatu yang tidak ditampilkan di sini.
memperbarui
df.set_value () telah ditinggalkan sejak versi 0.21.0 Anda dapat menggunakan df.at () sebagai gantinya:
sumber
Objek DataFrame Pandas harus dianggap sebagai Seri Seri. Dengan kata lain, Anda harus memikirkannya dalam hal kolom. Alasan mengapa ini penting adalah karena ketika Anda menggunakan
pd.DataFrame.iterrows
Anda beralih melalui baris sebagai Seri. Tapi ini bukan Seri yang disimpan oleh frame data dan jadi itu adalah Seri baru yang dibuat untuk Anda saat Anda beralih. Itu menyiratkan bahwa ketika Anda mencoba untuk menetapkannya, suntingan itu tidak akan berakhir tercermin dalam bingkai data asli.Ok, sekarang setelah itu: Apa yang kita lakukan?
Saran sebelum posting ini termasuk:
pd.DataFrame.set_value
tidak digunakan pada Pandas versi 0.21pd.DataFrame.ix
sudah usangpd.DataFrame.loc
baik-baik saja tetapi dapat bekerja pada pengindeks array dan Anda dapat melakukan lebih baikRekomendasi saya
Gunakan
pd.DataFrame.at
Anda bahkan dapat mengubah ini menjadi:
Respon terhadap komentar
sumber
Metode yang dapat Anda gunakan adalah
itertuples()
, itu berulang di baris DataFrame sebagai namedtuple, dengan nilai indeks sebagai elemen pertama dari tuple. Dan itu jauh lebih cepat dibandingkan denganiterrows()
. Sebabitertuples()
, masingrow
- masing berisiIndex
di dalam DataFrame, dan Anda bisa menggunakanloc
untuk mengatur nilainya.Dalam kebanyakan kasus,
itertuples()
lebih cepat dariiat
atauat
.Terima kasih @SantiStSupery, menggunakan
.at
jauh lebih cepat daripadaloc
.sumber
df.loc[row.Index, 3] = x
tidak berhasil. Di sisi lain,df.loc[row.Index, 'ifor'] = x
berhasil!Anda harus menetapkan nilai dengan
df.ix[i, 'exp']=X
ataudf.loc[i, 'exp']=X
alih-alihdf.ix[i]['ifor'] = x
.Jika tidak, Anda sedang mengerjakan suatu tampilan, dan seharusnya mendapatkan pemanasan:
-c:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_index,col_indexer] = value instead
Namun yang pasti, loop mungkin sebaiknya diganti oleh beberapa algoritma vektor untuk memanfaatkan sepenuhnya
DataFrame
seperti yang disarankan oleh @Phillip Cloud.sumber
Nah, jika Anda akan beralih lagi, mengapa tidak menggunakan metode yang paling sederhana,
df['Column'].values[i]
Atau jika Anda ingin membandingkan nilai-nilai baru dengan yang lama atau yang seperti itu, mengapa tidak menyimpannya dalam daftar lalu tambahkan pada akhirnya.
sumber
sumber
Lebih baik menggunakan
lambda
fungsi menggunakandf.apply()
-sumber
Tambahkan angka MAX dari kolom. Sebagai contoh :
Output saya:
Sekarang, saya perlu membuat kolom di df2 dan mengisi nilai kolom yang menambah MAX.
Catatan: df2 pada awalnya hanya akan berisi Column1 dan Column2. kita membutuhkan kolom Sortid untuk dibuat dan tambahan MAX dari df1.
sumber