Создать новую категориальную переменную на основе нескольких двоичных столбцов - PullRequest
1 голос
/ 13 января 2020

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

Мой фрейм данных выглядит следующим образом

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 ]

3 голосов
/ 13 января 2020

Вы можете использовать точечное произведение:

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
2 голосов
/ 13 января 2020

Как насчет idxmax, обратите внимание, что будет выбран только первый максимум, у вас есть несколько ячеек, равных 1 на строку, вы можете попробовать решение Jez

df['Winner_Party']=df.eq(1).idxmax(1)
1 голос
/ 13 января 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...