基于多个二进制列创建新的分类变量
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
,您也可以仅过滤 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
怎么样 idxmax
,注意这只会 select 第一个最大值,你有多个单元格每行等于 1,你可能想尝试 Jez 的解决方案
df['Winner_Party']=df.eq(1).idxmax(1)
我有一个包含许多二元变量的数据框,我想基于其中许多二元变量创建一个具有分类值的新变量
我的数据框看起来像这样
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
,您也可以仅过滤 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
怎么样 idxmax
,注意这只会 select 第一个最大值,你有多个单元格每行等于 1,你可能想尝试 Jez 的解决方案
df['Winner_Party']=df.eq(1).idxmax(1)