替换数组或数据框中的值

时间:2018-06-27 19:10:31

标签: python-3.x pandas numpy dictionary lookup

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

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

这显然行不通,但似乎是解决问题的一种非常笨拙,可怕的方式。必须有一种查找查找数组而不是编写字典的方法。有人有指针吗?

2 个答案:

答案 0 :(得分:1)

您需要使用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]])

答案 1 :(得分:-1)

您可以不同地考虑您的问题。就像数组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数组,但这取决于如何获取数据。