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

时间:2020-01-13 14:52:10

标签: python pandas variables binary categorical-data

我有一个包含许多二进制变量的数据框,我想基于许多这些二进制变量创建一个具有分类值的新变量

我的数据框看起来像这样

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'

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

idxmax怎么样,请注意,这只会选择第一个max,每行有多个等于1的单元格,您可能想尝试Jez解法

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

答案 2 :(得分:1)

如果每行总是只有一个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
相关问题