【问题标题】:Pandas: map dictionary values on an existing column based on key from another column to replace NaNPandas:根据另一列的键在现有列上映射字典值以替换 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导出到这里。)

【问题讨论】:

  • 我认为数据很完美;)

标签: python pandas dictionary mapping


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-16
    • 2021-07-13
    • 2015-12-31
    • 2018-12-05
    • 2016-11-22
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多