2016-03-22 2 views
-1

Мне удалось получить желаемый конечный результат, однако должен быть более эффективный способ сделать это. Позвольте мне провести вас через:Более эффективный маршрут

У меня есть 100 столбцов мнений по 20 категориям.

This is what the data looks like

В изображении выше Здоровье и РАБОТУ являются 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 так что любые советы/предложения о том, как сделать более эффективными эти шаги были бы весьма признательны ,

+0

Ну, во-первых, 'список ([Col окра в df.columns если«ЗДОРОВЬЕ»в седловине])' является излишним ; во внутренности списка создается 'list', тогда конструктор' list' принимает этот 'list', неглубоко копирует его, возвращает новый' list', а исходный 'list' уничтожается. Удалите 'list()' вокруг обоих списков, и пусть Python построит 'list' непосредственно только один раз. – ShadowRanger

ответ

0

Рассмотрите процесс изменения формы с использованием pandas 'wide_to_long(). Вам нужно будет установить числовое значение, здесь будет key для вывода. Конечно, переименовать конечные столбцы (без подчеркивания) и сортировать по мере необходимости по категориям:

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'RESPID': [1,1,1,1,1], 
        'HEALTH_SD': [1,np.nan, np.nan, np.nan, np.nan], 
        'HEALTH_D': [np.nan, 2, np.nan, np.nan, np.nan], 
        'HEALTH_N': [np.nan, np.nan, 3, np.nan, np.nan], 
        'HEALTH_A': [np.nan, np.nan, np.nan, 4, np.nan], 
        'HEALTH_SA': [np.nan, np.nan, np.nan, np.nan, 5], 
        'JOB_SD': [1, np.nan, np.nan, np.nan, np.nan], 
        'JOB_D': [np.nan, 3, np.nan, np.nan, np.nan], 
        'JOB_N': [np.nan, np.nan, 2, np.nan, np.nan], 
        'JOB_A': [np.nan, np.nan, np.nan, 5, np.nan], 
        'JOB_SA': [np.nan, np.nan, np.nan, np.nan, 4]}) 
print df[['RESPID', 'HEALTH_SD', 'HEALTH_D', 'HEALTH_N', 'HEALTH_A', 'HEALTH_SA', 
     'JOB_SD', 'JOB_D', 'JOB_N', 'JOB_A', 'JOB_SA']] 
# RESPID HEALTH_SD HEALTH_D HEALTH_N HEALTH_A HEALTH_SA JOB_SD JOB_D JOB_N JOB_A JOB_SA 
#0  1   1  NaN  NaN  NaN  NaN  1 NaN NaN NaN  NaN 
#1  1  NaN   2  NaN  NaN  NaN  NaN  3 NaN NaN  NaN 
#2  1  NaN  NaN   3  NaN  NaN  NaN NaN  2 NaN  NaN 
#3  1  NaN  NaN  NaN   4  NaN  NaN NaN NaN  5  NaN 
#4  1  NaN  NaN  NaN  NaN   5  NaN NaN NaN NaN  4 

df['KEY'] = 1 
rdf = pd.wide_to_long(df, ['HEALTH_', 'JOB_'], i='RESPID', j='CATEG').dropna().reset_index()  
print rdf 

# RESPID CATEG KEY HEALTH_ JOB_ 
#0  1  A 1  4  5 
#1  1  D 1  2  3 
#2  1  N 1  3  2 
#3  1 SA 1  5  4 
#4  1 SD 1  1  1 
Смежные вопросы