2016-03-21 51 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} 

我還創建的數據幀中的列我想的列表中,如果要被改變的當前列值= 1稱爲[op_cols]。現在,我一直在嘗試使用這樣,通過在這些列中的值進行迭代,並在字典中的映射值替換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

所以,如果我理解你的問題,你想用1來替換全部爲一列, 2,3,4,5取決於列名?

我認爲,所有你需要做的是通過你的清單,多由值迭代您的字典回報:

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

這確實你的描述,是遠遠快於替換每個值。 NaNs仍然是NaNs,如果你也喜歡,你可以用fillna處理循環中的那些。

+0

謝謝@tvashtar這個工作完美,我沒想過要循環訪問列名。感謝這方面的幫助 – da4l