微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pandas .map 字典默认缺失值

如何解决Pandas .map 字典默认缺失值

Pandas Docs for pandas.Series.map 说:

"当 arg 是字典时,Series 中不在字典中的值(作为键)被转换为 NaN。但是,如果字典是定义 missing 的 dict 子类(即提供认值的一种方法),则使用此认值而不是 NaN。"

你实际上是怎么做到的?我无法让它工作..

class MyDict(collections.UserDict):
    
  def __missing__(self):
    return "_UnkNown"

d = MyDict({k: v for k,v in my_list})

df.col1.map(d)

解决方法

您需要 (self,key) 作为 __missing__ 的参数:

class MyDict(dict):
    def __missing__(self,key):
        return "_Unknown"

import pandas as pd

s = pd.Series(range(4))
d = {0: 'foo',1: 'bar',2: 'baz'}

s.map(MyDict(d))
#0         foo
#1         bar
#2         baz
#3    _Unknown
#dtype: object

虽然这个功能很好,但 map 在使用标准字典时是一种非常有效的 Pandas 方法,上面的方法会减慢它的速度(如下所示)。因此,您可以使用普通字典 map 然后链接 .fillna 来处理默认值。

s.map(d).fillna('_Unknown')
#0         foo
#1         bar
#2         baz
#3    _Unknown
#dtype: object

使用带有丢失键的特殊返回值的字典与后跟 .fillna 的普通字典的时序图。 MyDict 对于非常小的映射要快得多,但对于较大的系列则较慢。

import perfplot
import pandas as pd
import numpy as np

class MyDict(dict):
    def __missing__(self,key):
        return "_Unknown"

d = {0: 'foo',2: 'baz'}  
d2 = MyDict(d)

def map_fillna(s,d):
    return s.map(d).fillna("_Unknown")

def use_MyDict(s,MyDict):
    return s.map(MyDict)


perfplot.show(
    setup=lambda n: pd.Series(np.random.choice(range(7),n)),kernels=[
        lambda s: map_fillna(s,d),lambda s: use_MyDict(s,d2),],labels=['map + fillna','MyDict'],n_range=[2 ** k for k in range(1,27)],equality_check= lambda x,y: x.compare(y).empty,xlabel='len(s)'
)

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。