替换数组或数据框中的值
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
数组,但这取决于您获取数据的方式。
我有一个 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
数组,但这取决于您获取数据的方式。