Мне удалось получить желаемый конечный результат, однако должен быть более эффективный способ сделать это. Позвольте мне провести вас через:Более эффективный маршрут
У меня есть 100 столбцов мнений по 20 категориям.
В изображении выше Здоровье и РАБОТУ являются 2 из 20 категорий. Кандидатам предлагается оценивать личную важность каждой категории. Они либо категорически не согласны (1), не соглашаются (2), ни мнения (3), соглашаются (4) или полностью согласны (5).
Что я хочу сделать, это создать новый столбец для каждой категории и уложить значения таким образом, чтобы один столбец соответствовал ответам кандидатов, а не распределялся по 5 столбцам. Было предопределено, что ни один кандидат не дал двух ответов для категории. Зеленые столбцы на картинке выше показывают желаемый результат.
Вот неэффективный маршрут я взял:
Данные файла CSV чтения при помощи панд.
Я создал список для каждой категории, так что 20 списков:
df.columns
health = list([col for col in df.columns if 'HEALTH' in col])
job = list([col for col in df.columns if 'JOB' in col])
Затем я создал 20 новых столбцов в кадре данных, который принимает максимальное значение из столбцов в соответствующем списке, используя код, приведенный ниже.
df['HEALTH'] = df[health].max(axis=1)
df['JOB'] = df[job].max(axis=1)
Последний шаг состоит в том, чтобы удалить эти 100 исходных столбцов и иметь только 20 новых отдельных столбцов со всеми поставленными кандидатами ответами.
Это было сделано с помощью кода ниже, используя список исходных столбцов мнение:
df.drop(df[op_cols], axis=1, inplace=True)
df.info()
Я учу сам Python 2.7 так что любые советы/предложения о том, как сделать более эффективными эти шаги были бы весьма признательны ,
Ну, во-первых, 'список ([Col окра в df.columns если«ЗДОРОВЬЕ»в седловине])' является излишним ; во внутренности списка создается 'list', тогда конструктор' list' принимает этот 'list', неглубоко копирует его, возвращает новый' list', а исходный 'list' уничтожается. Удалите 'list()' вокруг обоих списков, и пусть Python построит 'list' непосредственно только один раз. – ShadowRanger