基于多个二进制列创建新的分类变量

Create new categorical variable based on multiple binary columns

我有一个包含许多二元变量的数据框,我想基于其中许多二元变量创建一个具有分类值的新变量

我的数据框看起来像这样

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'

您可以使用点积:

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

如果每行始终只有一个 1,请使用 DataFrame.dot,您也可以仅过滤 10 列:

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

怎么样 idxmax,注意这只会 select 第一个最大值,你有多个单元格每行等于 1,你可能想尝试 Jez 的解决方案

df['Winner_Party']=df.eq(1).idxmax(1)