Pandas .map字典默认缺失值
Pandas .map dictionary default missing value
Pandas Docs 对于 pandas.Series.map 表示:
"当 arg 是字典时,Series 中不在字典中的值(作为键)将转换为 NaN。但是,如果字典是定义 missing[=20 的字典子类=](即提供默认值的方法),则使用此默认值而不是 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
使用带有特殊 return 的字典来表示缺失键的时间与使用普通字典后跟 .fillna
的计时说明。 MyDict
对于非常小的映射要快得多,但对于较大的系列要慢得多。
import perfplot
import pandas as pd
import numpy as np
class MyDict(dict):
def __missing__(self, key):
return "_Unknown"
d = {0: 'foo', 1: 'bar', 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)'
)
Pandas Docs 对于 pandas.Series.map 表示:
"当 arg 是字典时,Series 中不在字典中的值(作为键)将转换为 NaN。但是,如果字典是定义 missing[=20 的字典子类=](即提供默认值的方法),则使用此默认值而不是 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
使用带有特殊 return 的字典来表示缺失键的时间与使用普通字典后跟 .fillna
的计时说明。 MyDict
对于非常小的映射要快得多,但对于较大的系列要慢得多。
import perfplot
import pandas as pd
import numpy as np
class MyDict(dict):
def __missing__(self, key):
return "_Unknown"
d = {0: 'foo', 1: 'bar', 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)'
)