大熊猫替换非空列值与一个字典的键值对

问题描述:

假设我有一个数据帧: 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解决方案吗? 非常感谢所有帮助新手的人。

您可以先更新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 

选项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