Возвращаемые значения основаны на столбце, разделенном запятой и двумя другими столбцами - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть таблица ниже:

My Table

Я хочу добавить столбец (оценка), который возвращает один из элементов в столбцах автомобилей (через запятую).Элемент для возврата будет основан на столбцах Ferrari и Toyota.Столбец Оценка возвращает элемент, которого у человека нет.Так возьмите первый ряд, например, у Джона есть один Ferrari и нет Тойоты.Поскольку у Джона нет Тойоты, столбец оценки возвращает Тойоту.

Result

Я бы предпочел, чтобы решение было принято с использованием колонки автомобилей, разделяя текст назапятая и поиск текста против значений под Ferrari и Toyota

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

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

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(', ')
0 голосов
/ 13 ноября 2018
df = pd.DataFrame({'a': [0,0,1,1], 'b': [0,1,0,1]})

Создает следующий фрейм данных:

   a  b
0  0  0
1  0  1
2  1  0
3  1  1

Вы можете добавить новый столбец со списком имен столбцов, равным нулю, с помощью:

df['evaluated'] = df.apply(lambda x: ','.join(df.columns[x == 0]), axis=1)

Выход:

   a  b evaluated
0  0  0       a,b
1  0  1         a
2  1  0         b
3  1  1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...