Pandas:根据另一列的键在现有列上映射字典值以替换 NaN
Posted
技术标签:
【中文标题】Pandas:根据另一列的键在现有列上映射字典值以替换 NaN【英文标题】:Pandas: map dictionary values on an existing column based on key from another column to replace NaN 【发布时间】:2020-06-24 08:04:50 【问题描述】:我仔细看了看,似乎找不到这个问题的答案。我想用字典中的值替换我的 DataFrame 的 Department Code 列中的所有 NaN 值,使用 Job Number 列作为与字典匹配的 Key。数据如下图:请注意有很多额外的列,这只是两列。)
df =
Job Number Department Code
0 3525 403
1 4555 NaN
2 5575 407
3 6515 407
4 7525 NaN
5 8535 102
6 3545 403
7 7455 102
8 3365 NaN
9 8275 403
10 3185 408
dict = '4555': '012', '7525': '077', '3365': '034'
我希望输出的样子是:
Job Number Department Code
0 3525 403
1 4555 012
2 5575 407
3 6515 407
4 7525 077
5 8535 102
6 3545 403
7 7455 102
8 3365 034
9 8275 403
10 3185 408
这两列是对象数据类型,我已经尝试过我之前使用过的替换功能,但只有当键在同一列时才会替换值。
df['Department Code'].replace(dict, inplace=True)
这不会替换 NaN 值。
我确信答案很简单,我提前道歉,但我只是卡住了。
(请原谅我的代码显示不好,它是手写的,不知道如何将代码从python导出到这里。)
【问题讨论】:
我认为数据很完美;) 【参考方案1】:最好避免变量dict
,因为builtin
(python代码字),然后使用Series.fillna
将匹配的值替换为Series.map
,如果没有匹配值返回NaN
,所以不替换:
d = '4555': '012', '7525': '077', '3365': '034'
df['Department Code'] = df['Department Code'].fillna(df['Job Number'].astype(str).map(d))
print (df)
Job Number Department Code
0 3525 403
1 4555 012
2 5575 407
3 6515 407
4 7525 077
5 8535 102
6 3545 403
7 7455 102
8 3365 034
9 8275 403
10 3185 408
【讨论】:
是的,很抱歉,字典名称实际上是 dep_dict,我刚刚缩短了它,我正在尝试这种方法,但似乎没有改变任何东西。我会再试一次。感谢您的回复。 效果很好,我的字典键是导致最初问题的 int 类型,已修复。谢谢你。另外,您能否解释一下 fillna 位,不确定为什么在这种情况下有效? @jazrael【参考方案2】:或者另一种方式是使用set_index
和fillna
:
df['Department Code'] = (df.set_index('Job Number')['Department Code']
.fillna(d).values)
print(df)
Job Number Department Code
0 3525 403
1 4555 012
2 5575 407
3 6515 407
4 7525 077
5 8535 102
6 3545 403
7 7455 102
8 3365 034
9 8275 403
10 3185 408
【讨论】:
以上是关于Pandas:根据另一列的键在现有列上映射字典值以替换 NaN的主要内容,如果未能解决你的问题,请参考以下文章
Pandas Multiindex Groupby 聚合列与另一列的值