python - 将标签数组映射到 pandas 系列中的值

标签 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

我想我明白为什么这不起作用,但是采取 numpy.ndarray 的正确方法是什么?大小 (m x n) 包含索引值并返回(可以转换为的东西) numpy.ndarray大小 (m x n) 包含相应的值?

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

编辑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]])

最佳答案

这是使用 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]])

关于python - 将标签数组映射到 pandas 系列中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34909034/

相关文章:

python - 曲线插值

php - 如何导出每个键值对位于单独行中的 PHP 数组?

javascript - 在具有特定条件的 lodash 中添加和组合对象数组中的重复项

python - 在 Pandas 中合并数据帧时的组合爆炸

arrays - 有效地堆叠阵列/ torch 张量的副本?

python - 如何遍历优先级队列?

python - Pandas:使用 `df.loc` 从 datetime64 到 int 的类型转换

python - 有效地对 pandas 中的数据帧进行分组?

C++在学生列表中搜索和排序

python - 拟合曲线 : why small numbers are better?