Pandas 使用dict的键值对替换非空列值
假设我有一个数据帧: df1: 我还有一个口述,其中: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中,如果键作为列名存在,则值已
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