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

时间:2020-09-11 12:58:05

标签: python pandas numpy

我有两个大的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数组或pandas数据处理此请求的任何解决方案。

2 个答案:

答案 0 :(得分:1)

假设a的第一列的格式为[1, 2, 3...],可以使用此单行代码完成:

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

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

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

b的最后两列被转换为a的索引。如果a的第一列与[1, 2, 3...]不同,则减去一个是不够的,您需要考虑如何将b的最后两列映射到相对于{ {1}}。我将其排除在范围之外。

答案 1 :(得分:0)

两个建议。

  1. 如果它们在熊猫数据框中,则可以根据列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)