Создайте новую категориальную переменную на основе нескольких двоичных столбцов

У меня есть фрейм данных со многими двоичными переменными, и я хотел бы создать новую переменную с категориальными значениями на основе многих из этих двоичных переменных.

Мой фрейм данных выглядит так

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

I переменная, которую я хотел бы создать, называется 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, обратите внимание, что будет выбран только первый максимум, у вас есть несколько ячеек, равных 1 в строке, вы можете попробовать решение Джеза

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