Python Pandas Series.map等效于NumPy

Python Pandas Series.map等效于NumPy,python,pandas,numpy,Python,Pandas,Numpy,我有一个查找值的字典dictionary={'a':1,'b':2,'c':3,'d':3} 我希望从numpy得到的结果是pandas.Series.map()传入字典后返回的内容。例如series.map(字典,na_action='ignore') 注意:这个series.map()函数速度非常快,这让我相信numpy API中一定有一个等价的函数,而不是我实现一些涉及numpy.where()和循环字典键的解决方案 这是一个小家伙- def map_series_by_dict(s, d

我有一个查找值的字典
dictionary={'a':1,'b':2,'c':3,'d':3}

我希望从numpy得到的结果是
pandas.Series.map()
传入字典后返回的内容。例如
series.map(字典,na_action='ignore')

注意:这个
series.map()
函数速度非常快,这让我相信numpy API中一定有一个等价的函数,而不是我实现一些涉及
numpy.where()
和循环字典键的解决方案

这是一个小家伙-

def map_series_by_dict(s, d):
    a = s.values
    v = np.array(list(d.values()))
    k = np.array(list(d.keys()))    
    sidx = k.argsort()
    out_ar = v[sidx[np.searchsorted(k,a,sorter=sidx)]]
    return pd.Series(out_ar, index=s.index)
样本运行-

In [143]: d
Out[143]: {'a': 1, 'b': 2, 'c': 3, 'd': 3}

In [144]: s
Out[144]: 
0    a
1    a
2    c
3    b
4    a
dtype: object

In [145]: map_series_by_dict(s, d)
Out[145]: 
0    1
1    1
2    3
3    2
4    1

对于一般(非dict)情况,请参阅。如果我理解正确,这是否会分解输入值,以便您不必对每个值分别调用
dict.get
?我假设这就是
sidx
+
np.searchsorted
的目的。如果是这种情况,那么值得注意的是,这就是为什么它比一般的
np.vectorize
dict.get
更快的原因。此外,您的答案可能应该在这里:。可能会生成更多视图的地方+upvotes:)。@jpp好吧,提取部分以从dict中获取值和键可以被认为是设置开销,之后应该进行矢量化。关于寻找更深入的问答的良好呼吁。我会提醒自己尽快添加此搜索,谢谢!