Python 3.x 替换数组或数据帧中的值
我有一个numpy值数组(从更大的数据集简化): 我想将其转化为以下值: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.,
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)