Buat variabel kategori baru berdasarkan beberapa kolom biner

Saya memiliki bingkai data dengan banyak variabel biner dan saya ingin membuat variabel baru dengan nilai kategoris berdasarkan banyak variabel biner ini

Kerangka data saya terlihat seperti ini

gov_winner    corp_winner    in part
        1              0           0
        0              1           0
        0              0           1

Variabel I yang ingin saya buat disebut winning_party dan akan terlihat seperti ini

gov_winner    corp_winner    in part    winning_party
        1              0           0             gov
        0              1           0            corp
        0              0           1         in part

Saya mulai mencoba kode berikut tetapi belum berhasil:

 harrington_citations = harrington_citations.assign(winning_party=lambda x: x['gov_winner'] 
 == 1 then x = 'gov' else x == 0)

Menggunakan jawaban anky_91 saya mendapatkan kesalahan berikut:

TypeError: can't multiply sequence by non-int of type 'str'


person Graham Streich    schedule 13.01.2020    source sumber
comment
Hanya ada kolom yang diisi oleh 1 dan 0 ?   -  person jezrael    schedule 13.01.2020
comment
[email protected] berfungsi?   -  person Quang Hoang    schedule 13.01.2020


Jawaban (3)


Anda dapat menggunakan perkalian titik:

df.assign(Winner_Party=df.dot(df.columns))
#df.assign(Winner_Party=df @ df.columns)

   gov_winner  corp_winner  in_part Winner_Party
0           1            0        0   gov_winner
1           0            1        0  corp_winner
2           0            0        1      in_part
person anky    schedule 13.01.2020
comment
Saya memperbarui jawaban saya dengan kesalahan yang saya dapatkan. Masalahnya mungkin bingkai data aktual yang saya kerjakan memiliki banyak variabel yang tidak terlibat dalam variabel baru yang sedang saya buat ini. Terima kasih. - person Graham Streich; 13.01.2020
comment
Saya dapat membuat df hanya dengan variabel yang saya gunakan untuk membuat variabel baru ini dan melihat apakah jawaban Anda berhasil... - person Graham Streich; 13.01.2020
comment
@GrahamStreich Mungkin Anda memiliki kolom yang tidak hanya memiliki 1 dan 0 , filter kolom tersebut dan coba - person anky; 13.01.2020

Bagaimana dengan idxmax, perhatikan ini hanya akan memilih max pertama, Anda memiliki beberapa sel sama dengan 1 per baris, Anda mungkin ingin mencoba solusi Jez

df['Winner_Party']=df.eq(1).idxmax(1)
person BENY    schedule 13.01.2020

Jika selalu hanya ada satu 1 per baris gunakan DataFrame.dot, Anda juga dapat memfilter hanya kolom 1 dan 0 sebelum:

df1 = df.loc[:, df.isin([0,1,'0','1']).all()].astype(int)
df['Winner_Party'] = df1.dot(df1.columns)

Tetapi jika ada beberapa 1 per baris dan membutuhkan semua nilai yang cocok, tambahkan pemisah lalu hapus:

df['Winner_Party'] = df1.dot(df1.columns + ',').str.rstrip(',')

print (df)
   gov_winner  corp_winner  in part Winner_Party
0           1            0        0   gov_winner
1           0            1        0  corp_winner
2           0            0        1      in part
person jezrael    schedule 13.01.2020