Вы можете использовать:
df = pd.DataFrame({'Names':['John'] * 2 + ['Peter'] * 2 + ['Sam'] * 2,
'Cars':['Ferrari, Toyota','Ferrari','Ferrari, Toyota','Ferrari',
'Ferrari, Toyota','Ferrari, Toyota'],
'Ferrari': [1,1,0,0,1,1],
'Toyota': [0,1,1,0,1,0]})
df['Evaluation1'] = df.iloc[:, 2:].ne(1).dot(df.columns[2:] + ', ').str.rstrip(', ')
print (df)
Names Cars Ferrari Toyota Evaluation1
0 John Ferrari, Toyota 1 0 Toyota
1 John Ferrari 1 1
2 Peter Ferrari, Toyota 0 1 Ferrari
3 Peter Ferrari 0 0 Ferrari, Toyota
4 Sam Ferrari, Toyota 1 1
5 Sam Ferrari, Toyota 1 0 Toyota
Подробности :
Сначала выбрать все столбцы без первых 2 с помощью iloc
и создать логическое значениемаска - сравните на ne
(!=
):
print (df.iloc[:, 2:].ne(1))
Ferrari Toyota
0 False True
1 False False
2 True False
3 True True
4 False False
5 False True
Затем используйте умножение матриц на dot
с именами столбцов с разделителем:
print (df.iloc[:, 2:].ne(1).dot(df.columns[2:] + ', '))
0 Toyota,
1
2 Ferrari,
3 Ferrari, Toyota,
4
5 Toyota,
dtype: object
И удалить последний разделитель с помощью rstrip
:
print (df.iloc[:, 2:].ne(1).dot(df.columns[2:] + ', ').str.rstrip(', '))
0 Toyota
1
2 Ferrari
3 Ferrari, Toyota
4
5 Toyota
dtype: object
Если невозможно, выберите по позиции, так как возможно изменение позиций столбцов без 0,1
используйте drop
для удаления ненужных столбцов:
df1 = df.drop(['Names','Ferrari'], axis=1).ne(1)
df['Evaluation2'] = df1.dot(df1.columns + ', ').str.rstrip(', ')