这可能是错误的一般方法,但我正在尝试使用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]])
答案 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)