用另一个数组的特定值替换一个数组中的值

2024-06-02 05:17:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个大的numpy阵列或数据帧,例如:

a=[[1, 10, 20, 30],[2, 50, 14, -10],[3, 11, 2, 0], ...] 

b=[[10, 40, 30, 1, 1, 2],[0, 11, -1, 32, 3, 2],[9, 2, 51, -2, 3, 2], ...]

我想用a的值替换矩阵b的最后两列。我想说的是,在a的最后两列中,我们有1,替换为a中包含1作为a的第一列的行。此列是从1到结尾的计数器。事实上,在最后,矩阵b的列将从6列增加到10列

因此,新的b将类似于:

b=[[10, 40, 30, 1, 10, 20, 30, 50, 14, -10],[0, 11, -1, 32, 11, 2, 0, 50, 14, -10],[9, 2, 51, -2, 10, 20, 30, 11, 2, 0], ...]

我非常感谢任何以numpy数组或熊猫数据处理此请求的解决方案


Tags: 数据numpy结尾计数器矩阵数组解决方案数据处理
2条回答

假设a的第一列的形式为[1, 2, 3...],则可以使用此一行:

np.c_[b[:,:-2], a[b[:,-2]-1, 1:], a[b[:,-1]-1, 1:]]

事实上,用a[:, 1:]替换a更方便,可以这样简化:

np.c_[b[:,:-2], a[b[:,-2]-1], a[b[:,-1]-1]]

b的最后两列被转换为a的索引。如果a的第一列与[1, 2, 3...]不同,减去一列是不够的,您需要考虑如何将b的最后两列映射到与a相关的索引。我把它放在范围之外了

两个建议

  1. 如果这些数据帧位于pandas数据帧中,则可以根据列b.5=a0.1和b.6=a1.1将“a”数据帧连接到“b”数据帧两次。然后读出所需的列(b.1-4、a0.2-4、a1.2-4。类似于:

    new1 = pd.merge(b, a, left_on='5', right_on='1')
    new2 = pd.merge(new1, a, left_on='6', right_on='1')
    

然后删除第5列和第6列

  1. 否则,建议将“a”转换为不同的结构、元组列表或字典。您的索引作为第一个值嵌入,因此如果您在字典中失败,您将尝试获取{1:[10,20,30]、2:[50,14,-10]、3:[11,2,0]…},这使得查找更容易

    newlist = []
    for x in b:
        q = x[:4]
        q.extend(a[x[4]])
        q.extend(a[x[5]])
        newlist.append(q)
    

相关问题 更多 >