【问题标题】:Pandas Series.map equivalent in NumPyNumPy 中的 Pandas Series.map 等效项
【发布时间】:2018-10-05 03:03:20
【问题描述】:

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

我想从 numpy 得到的结果是 pandas.Series.map() 在传入字典后返回的结果。比如series.map(dictionary, na_action='ignore')

注意:这个 series.map() 函数非常快,这让我相信 numpy API 中必须有一个等价物,而不是我实现一些涉及 numpy.where() 的解决方案并用于遍历字典键。

【问题讨论】:

标签: python pandas numpy


【解决方案1】:

这是一个 NumPy -

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.get?我认为这是sidx + np.searchsorted 的目的。如果是这种情况,值得注意的是,这就是为什么它比通用的 np.vectorizedict.get 更快的原因。
  • 另外,你的答案可能应该在这里:Translate every element in numpy array according to key。哪里有可能产生更多的意见+赞成:)。
  • @jpp 好吧,提取部分以从 dict 中获取值和键可以被认为是设置开销,之后应该进行矢量化。很好地呼吁寻找更深入的问答。会提醒自己尽快添加基于它的搜索排序,谢谢!
猜你喜欢
  • 2021-08-12
  • 2017-02-18
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
  • 2017-10-03
  • 1970-01-01
相关资源
最近更新 更多