Pandas 使用dict的键值对替换非空列值

Pandas 使用dict的键值对替换非空列值,pandas,dictionary,dataframe,match,Pandas,Dictionary,Dataframe,Match,假设我有一个数据帧: df1: 我还有一个口述,其中: dict_1= {'AC':0.23,'BC':1.2, 'AK':0.45, 'BJ': 2.2, 'ABFK':4.5....} dict1中的所有键不一定都是df1的列,键值对的总数可能是10000,列只有1100。所以大量的键不是像'ABFK'那样的列,键在df1中不存在 类似地,在dict_1中可能存在不是键的列名。例如,“SDFG”列标题在dict中没有相关键 我想返回一个数据帧,其中在dict1中,如果键作为列名存在,则值已

假设我有一个数据帧: df1:

我还有一个口述,其中:

dict_1= {'AC':0.23,'BC':1.2, 'AK':0.45, 'BJ': 2.2, 'ABFK':4.5....}
dict1中的所有键不一定都是df1的列,键值对的总数可能是10000,列只有1100。所以大量的键不是像'ABFK'那样的列,键在df1中不存在 类似地,在dict_1中可能存在不是键的列名。例如,“SDFG”列标题在dict中没有相关键

我想返回一个数据帧,其中在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                        
因此,所有(1)都被基于字典的值替换。如果该键不像SDFG那样存在,它将更改为默认值0.13。最后,我希望有一个完整的列名,它在整行中求和

对此,什么是简单的解决方案?
非常感谢所有帮助新手的人

您可以先更新
dict
,然后将其用于
NaN
s,其替换为:


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

要包括
总计

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
我们可以用
df.columns
创建一个新的
pd.Series
reindex
,然后用
填充

# 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

我们可以继续以与上面相同的方式添加一个
总计

这是一个很好的解决方案。谢谢@珀尔很高兴我能帮忙。
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
# 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