2016-03-21 12 views
0

私はこの間に私の頭を包み込み、解決策を見出そうとしています。データのクリーニング:現在の列の値を辞書にマップされている値に置き換えます。

私の質問は、基準が満たされた場合、列名に基づいて複数の列の現在の列値を変更する方法です。

私はパンダのcsvデータフレームとして読み込まれた調査データを持っている:

現在の列の値が等しい場合、私は、私は、各列にしたい列名を持つ辞書と値を作成している
import pandas as pd 
df = pd.read_csv("survey_data") 

1.各列には、1またはNaNが含まれます。基本的に '_SA' = 5、 '_A' = 4、 '_NO' = 3、 '_D' = 2および '_SD'で終わるデータフレーム内の列は、現在の値1のままです。 'NaN'値そのまま残す。

op_dict = { 
'op_dog_SA':5, 
'op_dog_A':4, 
'op_dog_NO':3, 
'op_dog_D':2, 
'op_dog_SD':1, 
'op_cat_SA':5, 
'op_cat_A':4, 
'op_cat_NO':3, 
'op_cat_D':2, 
'op_cat_SD':1, 
'op_fish_SA':5, 
'op_fish_A':4, 
'op_fish_NO':3, 
'op_fish_D':2, 
'op_fish__SD':1} 

Iはまた、私はたいデータフレーム内の列のリストを作成した場合に変更される[op_cols]と呼ばれる現在の列の値= 1:この辞書です。今、私はそれらの列の値を反復処理し、辞書内のマッピングされた値が1に置き換えられ、このようなものを使用しようとしている:それは、エラーを吐き出していませんが、それは1を交換していない

for i in df[op_cols]: 
    if i == 1: 
     df[op_cols].apply(lambda x: op_dict.get(x,x)) 

df[op_cols] 

値を辞書からの対応する値で置き換えます。それは、1

として、これは動作しないでしょうか、より効率的な方法は、大幅に私はあなたの質問を理解していればあなたは1で、カラム内のすべてのものを交換したいので

答えて

0

をいただければ幸いです理由について何かアドバイス/提案のまま2,3,4,5は列名によって異なりますか?

私はあなたがする必要があるすべては値によってあなたのリストと複数を通して、あなたのdictのリターンを繰り返すだと思う:

for col in op_cols: 
    df[col] = df[col]*op_dict[col] 

これはあなたが記述するもの行い、すべての値を交換するよりもはるかに高速です。 NaNはまだNaNですが、あなたが好きなら、fillnaでループ内のそれらを処理することもできます。

+0

@tvashtarありがとう、これは完全に働いた、私は列名をループするとは思わなかった。これに関する助けを感謝します – da4l

関連する問題