สร้างตัวแปรหมวดหมู่ใหม่โดยยึดตามคอลัมน์ไบนารีหลายคอลัมน์

ฉันมีกรอบข้อมูลที่มีตัวแปรไบนารี่จำนวนมาก และฉันต้องการสร้างตัวแปรใหม่ที่มีค่าหมวดหมู่ตามตัวแปรไบนารี่เหล่านี้จำนวนมาก

dataframe ของฉันมีลักษณะเช่นนี้

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

ตัวแปรที่ฉันต้องการสร้างเรียกว่า winning_party และจะมีหน้าตาเช่นนี้

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

ฉันเริ่มลองใช้รหัสต่อไปนี้แต่ยังไม่ประสบความสำเร็จ:

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

การใช้คำตอบของ anky_91 ฉันได้รับข้อผิดพลาดต่อไปนี้:

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


person Graham Streich    schedule 13.01.2020    source แหล่งที่มา
comment
มีเพียงคอลัมน์ที่เติมด้วย 1 และ 0 ?   -  person jezrael    schedule 13.01.2020
comment
[email protected]ได้ผลเหรอ?   -  person Quang Hoang    schedule 13.01.2020


คำตอบ (3)


คุณสามารถใช้ผลิตภัณฑ์ดอท:

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
ฉันอัปเดตคำตอบพร้อมข้อผิดพลาดที่ได้รับ ปัญหาอาจเป็นได้ว่ากรอบข้อมูลจริงที่ฉันทำงานด้วยมีตัวแปรหลายตัวที่ไม่เกี่ยวข้องกับตัวแปรใหม่นี้ที่ฉันกำลังสร้าง ขอบคุณ. - person Graham Streich; 13.01.2020
comment
ฉันสามารถสร้าง df ด้วยตัวแปรที่ฉันใช้เพื่อสร้างตัวแปรใหม่นี้และดูว่าคำตอบของคุณใช้ได้หรือไม่... - person Graham Streich; 13.01.2020
comment
@GrahamStreich อาจเป็นว่าคุณมีคอลัมน์ที่ไม่เพียงมี 1 และ 0 กรองคอลัมน์ดังกล่าวออกแล้วลอง - person anky; 13.01.2020

แล้ว idxmax สังเกตว่านี่จะเลือกเฉพาะค่า max แรกเท่านั้น คุณมีหลายเซลล์เท่ากับ 1 ต่อแถว คุณอาจต้องการลองใช้วิธีแก้ปัญหาของ Jez

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

หากมี 1 เพียงหนึ่งรายการต่อแถวเสมอ ให้ใช้ DataFrame.dot นอกจากนี้ คุณยังสามารถกรองเฉพาะคอลัมน์ 1 และ 0 ก่อน:

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

แต่ถ้ามีหลาย 1 ต่อแถวและต้องการค่าที่ตรงกันทั้งหมดให้เพิ่มตัวคั่นแล้วลบออก:

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