大熊猫替换非空列值与一个字典的键值对
问题描述:
假设我有一个数据帧: 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
然后用mask
为NaN
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.Series
和reindex
与df.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
列
这是一个很好的解决方案。谢谢! – Pearl
@Pearl很高兴我可以帮忙。 – piRSquared