将标签的ndarray映射到pandas系列中的值

时间:2016-01-20 19:40:19

标签: python arrays numpy pandas vectorization

这可能是错误的一般方法,但我正在尝试使用Pandas系列作为一些numpy字符串/标签数组的查找表:

import pandas as pd
import numpy as np

data_map = pd.Series([2, 4, 6, 0, 1], index=list('abcde'))
lab1d = np.array(['a', 'd', 'd', 'c'])
lab2d = np.array([['d', 'e'],
                  ['e', 'd'],
                  ['c', 'a'],
                  ['a', 'b']])

val1d = data_map.loc[lab1d]
val2d = data_map.loc[lab2d]

如果我这样做,val1d会正确解析为:

a    2
d    0
d    0
c    6
dtype: int64

val2d = data_map.loc[lab2d]提出ValueError

ValueError: Cannot index with multidimensional key

我想我得到了为什么这不起作用的原因,但是什么是采用包含Index值的numpy.ndarray大小(mxn)并返回(可以转换为)的numpy.ndarray的正确方法{{ 1}}大小(mxn)包含相应的值?

修改 我曾考虑将数据存储在字典中并使用numpy.vectorize(如this question所示),这绝对是我的后备,但我想澄清我有兴趣知道是否有办法使用一些熊猫方法来做到这一点。

编辑2 我应该澄清一点,我实际上正在寻找符合广播规则的东西,例如:

dmd = data_map.to_dict()
make_map = np.vectorize(dmd.__getitem__)

val1d = make_map(lab1d)
val2d = make_map(lab2d)

对于val1d返回的内容:

array([2, 0, 0, 6])

对于val2d返回:

array([[0, 1],
       [1, 0],
       [6, 2],
       [2, 4]])

2 个答案:

答案 0 :(得分:2)

这是使用np.searchsorted -

的矢量化方法
data_map[np.searchsorted(np.array(data_map.index),lab1d)]
data_map[np.searchsorted(np.array(data_map.index),lab2d)]

示例运行 -

>>> data_map = pd.Series([2, 4, 6, 0, 1], index=list('abcde'))
>>> lab1d = np.array(['a', 'd', 'd', 'c'])
>>> lab2d = np.array([['d', 'e'],
...                   ['e', 'd'],
...                   ['c', 'a'],
...                   ['a', 'b']])
>>> data_map[np.searchsorted(np.array(data_map.index),lab1d)]
a    2
d    0
d    0
c    6
dtype: int64
>>> data_map[np.searchsorted(np.array(data_map.index),lab2d)]
array([[0, 1],
       [1, 0],
       [6, 2],
       [2, 4]])

答案 1 :(得分:1)

您可以展平数组,然后重塑:

data_map[lab2d.ravel()].reshape(lab2d.shape)