我有一个包含许多二进制变量的数据框,我想基于许多这些二进制变量创建一个具有分类值的新变量
我的数据框看起来像这样
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'
答案 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
,那么您也只能在以下之前过滤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