2016-03-22 25 views
-1

私は管理していますが、最終的な結果が得られますが、これを行うにはより効率的な方法が必要です。より効率的なルート

私は20のカテゴリに関する意見データを100列持っています。健康やJOB上記画像で

This is what the data looks like

20種類の2です。候補者は、各カテゴリーの個人的重要性をランク付けするよう求められます。強く反対(1)、反対(2)、意見なし(3)、同意(4)または強く同意する(5)のいずれか。

私がしたいのは、カテゴリごとに新しい列を作成し、値を積み重ねることで、5列にわたって広がるのではなく候補の回答がある列があるからです。どの候補者もあるカテゴリに対して2つの回答を与えていないことは予め決められている。上の写真の緑色の列は、望ましい結果を示しています。

データはパンダを使用して読んでcsvファイルである:ここで

は、私が撮影した非効率的なルートです。

私は、とても20のリスト各カテゴリのリストを作成しました:私は、以下のコードを使用して、関連リストの列から最大値をとるデータフレームに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]) 

を。

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() 

私は自分自身がこれらの手順をより効率的にする方法について何かアドバイス/提案をいただければ幸いですので、2.7をPythonの教えています。

+0

;リスト内包は 'list'を生成し、' list'コンストラクタはその 'list'を受け取り、それをコピーして新しい' list'を返し、元の 'list'は破壊されます。両方のlistcompsの 'list()'を削除し、Pythonが 'list'を1回だけ直接構築させるようにしてください。 – ShadowRanger

答えて

0

パンダ 'wide_to_long()を使用して変形プロセスを検討してください。数値を設定する必要があります。出力にはkeyとなります。もちろん、(アンダースコアなし)最終列の名前を変更し、並べ替えなどのカテゴリ別に必要な:まあ、最初のオフ、 `リスト([df.columnsでコルのためのCOL COLの「HEALTH」の場合は、])`冗長である

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