2017-06-22 87 views
1

假設我有一個數據幀: DF1:大熊貓替換非空列值與一個字典的鍵值對

 AC BC AK BJ SDFG.... (1100 such columns) 
Tom 0 0 1 0 0 
Sally 1 0 1 1 0 
Nick 0 1 0 0 1 

我也有一個字典,其中:

dict_1= {'AC':0.23,'BC':1.2, 'AK':0.45, 'BJ': 2.2, 'ABFK':4.5....} 

這是沒有必要的dict1中的所有鍵都是df1的列,鍵值對的總數可能是10,000,列只有1100. SO有效鍵的數量不是像'ABFK'鍵那樣的列不存在於df1中 類似地,可能存在列名不是dict_1中的鍵。例如,'SDFG'列標題在字典中沒有關聯的鍵。

我想如果該鍵存在,作爲列名返回其中dict1值已經被取代的數據幀: 對於如我所希望得到的回覆是

 AC BC AK BJ SDFG.... (1100 such columns) TOTAL 
Tom 0 0 0.45 0  0        0.45 
Sally 0.23 0 0.45 2.2 0        2.7 
Nick 0 1.2 0  0  0.13       1.33       

因此,所有的(1S )已被基於字典的值取代。如果密鑰不像SDFG那樣存在,則將其更改爲默認值0.13。最後,我希望在整個行中有一個總的列名稱。

這將是一個簡單的PANDAS解決方案嗎? 非常感謝所有幫助新手的人。

回答

1

您可以先更新dict然後用maskNaN S的被fillna取代:

dict_1= {'AC':0.23,'BC':1.2, 'AK':0.45, 'BJ': 2.2, 'ABFK':4.5} 

dict_2 = {x: 0.13 for x in df.columns if x not in dict_1} 
dict_2.update(dict_1) 

df = df.mask(df == 1).fillna(df.columns.to_series().replace(dict_2)) 
df['TOTAL'] = df.sum(axis=1) 
print (df) 
     AC BC AK BJ SDFG TOTAL 
Tom 0.00 0.0 0.45 0.0 0.00 0.45 
Sally 0.23 0.0 0.45 2.2 0.00 2.88 
Nick 0.00 1.2 0.00 0.0 0.13 1.33 
2

選項1
您可以使用mask隱藏的,然後使用assign用字典拆包填寫這些蒙面值。

首先,創建一個新的字典,我們在默認

d = {c: dict_1.get(c, .13) for c in df} 
df.mask(df == 1, df.assign(**d)) 

     AC BC AK BJ SDFG 
Tom 0.00 0.0 0.45 0.0 0.00 
Sally 0.23 0.0 0.45 2.2 0.00 
Nick 0.00 1.2 0.00 0.0 0.13 

填寫要包括Total

d = {c: dict_1.get(c, .13) for c in df} 
d1 = df.mask(df == 1, df.assign(**d)) 
d1 = d1.assign(Total=d1.sum(1)) 
d1 

     AC BC AK BJ SDFG Total 
Tom 0.00 0.0 0.45 0.0 0.00 0.45 
Sally 0.23 0.0 0.45 2.2 0.00 2.88 
Nick 0.00 1.2 0.00 0.0 0.13 1.33 

選項2
或者,我們可以有我們編輯replace我們通過一個字典來定義要替換那個特定列的內容。

df.replace({c: {1: dict_1.get(c, .13)} for c in df}) 

     AC BC AK BJ SDFG 
Tom 0.00 0.0 0.45 0.0 0.00 
Sally 0.23 0.0 0.45 2.2 0.00 
Nick 0.00 1.2 0.00 0.0 0.13 

我們可以繼續添加Total列與上面相同的方式。


選項3
我們可以創建一個新的pd.Seriesreindexdf.columns然後fillna.13

# thanks @jezrael for fill_value reminder 
df * pd.Series(dict_1).reindex(df.columns, fill_value=.13) 

     AC BC AK BJ SDFG 
Tom 0.00 0.0 0.45 0.0 0.00 
Sally 0.23 0.0 0.45 2.2 0.00 
Nick 0.00 1.2 0.00 0.0 0.13 

我們可以繼續以同樣的方式與上述

添加 Total
+0

這是一個很好的解決方案。謝謝! – Pearl

+0

@Pearl很高興我可以幫忙。 – piRSquared