Python 3.x 替换数组或数据帧中的值

Python 3.x 替换数组或数据帧中的值,python-3.x,pandas,numpy,dictionary,lookup,Python 3.x,Pandas,Numpy,Dictionary,Lookup,我有一个numpy值数组(从更大的数据集简化): 我想将其转化为以下值: output = np.array([[1.2, 0., 2.4, 3.6] [1.2, 0., 3.6, 4.8] [1.2, 0., 4.8, 6. ] [1.2, 0., 6., 7.2] [1.2, 0., 7.2, 8.4] [1.2, 0., 8.4, 9. ] [1.2, 0., 9.,

我有一个numpy值数组(从更大的数据集简化):

我想将其转化为以下值:

output =
np.array([[1.2, 0., 2.4, 3.6]
          [1.2, 0., 3.6, 4.8]
          [1.2, 0., 4.8, 6. ]
          [1.2, 0., 6.,  7.2]
          [1.2, 0., 7.2, 8.4]
          [1.2, 0., 8.4, 9. ]
          [1.2, 0., 9.,  9.6]])
我有一个查找数组,我打算使用它,但无法确定如何使用它:

lookup =     
array([[ 1. ,  0. ]
       [ 2. ,  1.2]
       [ 3. ,  2.4]
       [ 4. ,  3.6]
       [ 5. ,  4.8]
       [ 6. ,  6. ]
       [ 7. ,  7.2]
       [ 8. ,  8.4]
       [ 9. ,  9. ]
       [ 10.,  9.6]])
我无法找到一种使用numpy数组的方法,所以我将数据转换为一个数据帧:

df = pd.DataFrame(data[:, :], columns=('A', 'B', 'M', 'N'))

df
Out[125]: 
   A  B  M   N
0  2  1  3   4
1  2  1  4   5
2  2  1  5   6
3  2  1  6   7
4  2  1  7   8
5  2  1  8   9
6  2  1  9  10
并尝试使用字典转换值:

di = {1: 0., 2: 1.2, 3: 2.4, 4: 3.6, 5: 4.8, 6: 6., 7: 7.2, 8: 8.4, 9: 9., 10: 9.6}

df.replace({'A': di})
Traceback (most recent call last):

  File "<ipython-input-124-6a329a5fa829>", line 1, in <module>
    df.replace({'A': di})

  File "C:\Users\russells\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\generic.py", line 4521, in replace
    raise ValueError("Replacement not allowed with "

ValueError: Replacement not allowed with overlapping keys and values
di={1:0,2:1.2,3:2.4,4:3.6,5:4.8,6:6,7:7.2,8:8.4,9:9,10:9.6}
replace({'A':di})
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
replace({'A':di})
文件“C:\Users\russells\AppData\Local\Continuum\anaconda3\lib\site packages\pandas\core\generic.py”,第4521行,替换为
raise VALUE ERROR(“不允许替换为”
ValueError:不允许使用重叠的键和值进行替换
这显然不起作用,但似乎是解决问题的一种非常笨拙、可怕的方法。必须有一种方法来查找查找数组,而不是编写字典。有人有任何指针吗?

为了直接映射值,需要使用它

def mapper(x):
    return lookup[lookup[:,0]==x][:,1][0]

v = np.vectorize(mapper)
data = v(data.astype(float))
输出:

array([[ 1.2,  0. ,  2.4,  3.6],
   [ 1.2,  0. ,  3.6,  4.8],
   [ 1.2,  0. ,  4.8,  6. ],
   [ 1.2,  0. ,  6. ,  7.2],
   [ 1.2,  0. ,  7.2,  8.4],
   [ 1.2,  0. ,  8.4,  9. ],
   [ 1.2,  0. ,  9. ,  9.6]])

你可以不同地考虑你的问题。就像数组<代码>数据< /代码>将索引包含到数组<代码>查找> /代码>中,除了从1开始。然后只需对它进行索引:

import numpy as np

# Orignial data
data = np.array([
    [2,  1,  3,  4, ],
    [2,  1,  4,  5, ],
    [2,  1,  5,  6, ],
    [2,  1,  6,  7, ],
    [2,  1,  7,  8, ],
    [2,  1,  8,  9, ],
    [2,  1,  9,  10]])
lookup = np.array([
    [1.,  0.],
    [2.,  1.2],
    [3.,  2.4],
    [4.,  3.6],
    [5.,  4.8],
    [6.,  6.],
    [7.,  7.2],
    [8.,  8.4],
    [9.,  9.],
    [10.,  9.6]])

# Create a 1-based lookup array from the second column
lookup2 = np.zeros(lookup.shape[0] + 1)
lookup2[1:] = lookup[:, 1]

# Index the lookup array
output = lookup2[data]
print(output)

也许你可以修改你的代码来直接创建
lookup2
数组,但这取决于你如何获取数据。

我认为如果你把范围缩小一点,有人会更容易帮助你,请给出一个非常基本的输入/输出示例。现在,看看你的输入数组,我不知道你从哪里得到a、b等,或者从哪里得到a关于查找数组与初始数组的关系,我已经将示例简化为一个公平数量,它确实有效,谢谢你的帮助。@georussell为什么投反对票?我的解决方案有效,应该比
np.vectorize
更快,而且它能满足OP的要求。
import numpy as np

# Orignial data
data = np.array([
    [2,  1,  3,  4, ],
    [2,  1,  4,  5, ],
    [2,  1,  5,  6, ],
    [2,  1,  6,  7, ],
    [2,  1,  7,  8, ],
    [2,  1,  8,  9, ],
    [2,  1,  9,  10]])
lookup = np.array([
    [1.,  0.],
    [2.,  1.2],
    [3.,  2.4],
    [4.,  3.6],
    [5.,  4.8],
    [6.,  6.],
    [7.,  7.2],
    [8.,  8.4],
    [9.,  9.],
    [10.,  9.6]])

# Create a 1-based lookup array from the second column
lookup2 = np.zeros(lookup.shape[0] + 1)
lookup2[1:] = lookup[:, 1]

# Index the lookup array
output = lookup2[data]
print(output)