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_indexfillna

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的主要内容,如果未能解决你的问题,请参考以下文章

SQL:根据另一列的值在列上保留一个具有最大值的行

Pandas Multiindex Groupby 聚合列与另一列的值

根据另一列中的值删除一列的重复项,Python,Pandas

Pandas:根据另一列的百分比增长率创建一个新列

从字典中添加具有映射值的新熊猫列[重复]

根据另一个数据框 python pandas 替换列值 - 更好的方法?