替换数组或数据框中的值

Replacing values in array or dataframe

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

data = 
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]])

我想将其转换为这些值:

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 数组执行此操作的方法,因此我将数据转换为 Pandas 数据帧:

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

这显然行不通,但也似乎是解决问题的一种非常笨拙、糟糕的方法。必须有一种查找查找数组而不是编写字典的方法。有人有什么指点吗?

您需要使用 numpy.vectorize 才能直接映射值。

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

你可以换个角度考虑你的问题。就好像数组 data 包含数组 lookup 的索引,除了它从 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 数组,但这取决于您获取数据的方式。