Saya memiliki kerangka data dan kamus. Saya perlu menambahkan kolom baru ke kerangka data dan menghitung nilainya berdasarkan kamus.
Pembelajaran mesin, menambahkan fitur baru berdasarkan beberapa tabel:
score = {(1, 45, 1, 1) : 4, (0, 1, 2, 1) : 5}
df = pd.DataFrame(data = {
'gender' : [1, 1, 0, 1, 1, 0, 0, 0, 1, 0],
'age' : [13, 45, 1, 45, 15, 16, 16, 16, 15, 15],
'cholesterol' : [1, 2, 2, 1, 1, 1, 1, 1, 1, 1],
'smoke' : [0, 0, 1, 1, 7, 8, 3, 4, 4, 2]},
dtype = np.int64)
print(df, '\n')
df['score'] = 0
df.score = score[(df.gender, df.age, df.cholesterol, df.smoke)]
print(df)
Saya mengharapkan output berikut:
gender age cholesterol smoke score
0 1 13 1 0 0
1 1 45 2 0 0
2 0 1 2 1 5
3 1 45 1 1 4
4 1 15 1 7 0
5 0 16 1 8 0
6 0 16 1 3 0
7 0 16 1 4 0
8 1 15 1 4 0
9 0 15 1 2 0
python
pandas
dataframe
dictionary
Mikola
sumber
sumber
MultiIIndex
. Alternatif:df['score'] =df.set_index(['gender', 'age', 'cholesterol', 'smoke']).index.map(score).fillna(0).to_numpy()
.df
melaluiset_index
, baruSeries
melalui konstruktor. Meskipun Anda mendapatkan manfaat dari penyelarasan indeks saat Anda menugaskannyadf['score']
. Terakhir,fillna(0, downcast='infer')
menyelesaikan pekerjaan tetapi tidak ada yang lebih suka solusi panjang ini dengan membuat banyak objek panda secara tidak perlu.merge
bisa capai. Saya pikir jawaban itu akan diposting dengan cepat jadi saya memilih alternatif dan untuk beberapa alasan ada MultiIndices di pikiran saya. Saya setuju, ini mungkin seharusnya bukan jawaban yang diterima, jadi semoga itu tidak terjadi.Menggunakan
assign
dengan pemahaman daftar, mendapatkan tupel nilai (setiap baris) dariscore
kamus, default ke nol jika tidak ditemukan.Pengaturan waktu
Mengingat berbagai pendekatan, saya pikir akan menarik untuk membandingkan beberapa timing.
sumber
score.get
saya akan menggunakanitertuples
atauzip(*map(df.get, df))
... Untuk mengulangi, ini adalah pendekatan yang saya sukai.df.assign(score=[score.get(t, 0) for t in zip(*map(df.get, df))])
1.0
sama dengan hash karena1
itu tuple look up harus menghasilkan jawaban yang sama. Permintaan maaf @Alexander atas begitu banyak komentar tentang hal ini, tetapi saya hanya ingin orang-orang memuji ini lebih karena ... mereka seharusnya (-:.values
itu mahalzip(*map(df.get, ['col2', 'col1', 'col5']))
atau mendapatkan tupel modifikasidf
:zip(*map(df.eq(1).get, df))
Anda dapat menggunakan peta , karena skor adalah kamus:
Keluaran
Sebagai alternatif, Anda dapat menggunakan pemahaman daftar:
sumber
Daftar pemahaman dan peta:
Keluaran:
sumber
reindex
Atau
merge
sumber
Mungkin cara lain akan menggunakan
.loc[]
:sumber
Solusi satu baris sederhana, Gunakan
get
dantuple
bijaksana untuk baris,Solusi di atas mengasumsikan tidak ada kolom selain yang diinginkan secara berurutan. Jika tidak, cukup gunakan kolom
sumber
score.get
yang baik. Namun, Anda harus lebih memilih pemahaman, menurut saya. Lihat @ pengaturan waktu Alexander .