【问题标题】:Using indexing and iteration to reformat values with Numpy Pandas Python使用 Numpy Pandas Python 使用索引和迭代重新格式化值
【发布时间】:2022-01-10 20:16:25
【问题描述】:

我想为每个唯一的digit_vals 值一个一个地遍历vals 数组中的列表。 digit_vals 值显示预期输出的第 n 个数字,因此由于 digit_vals 中的第一个值是 24,因此这意味着它之前的所有数字都将用零填充,而第 24 个数字将包含来自 @987654325 的值@。由于digit_vals 中有两个 24,这意味着vals ([-3.3, -4.3, 23.05, 23.08, 23.88, 3.72]) 的第一个列表中的第二个索引将包含预期输出中的第 24 个值,即-4.3vals 中第二个列表的第四个索引将包含 digit_vals 中第 27 个值的值,依此类推。 digit_vals 之间的空白也将在结果中用零填充,因此在 24 和 27 之间,第 25 位和第 26 位将分别有 2 个零。我怎样才能编写这个函数来实现下面的预期输出?

import pandas as pd 
import numpy as np 

digit_vals = np.array([24, 24, 27, 27, 27, 27,
                       28, 28, 28, 31])

vals = np.array([list([-3.3, -4.3, 23.05, 23.08, 23.88, 3.72]),
 list([2.3, 2.05, 3.08, -4.88, 4.72]),
 list([5.3, 2.05, 6.08, -13.88, -17.2]),
 list([9.05, 6.08, 3.88, -13.72])], dtype=object)

预期输出:

array([  0.         ,   0.        ,   0.        ,   0.        ,
          0.        ,   0.        ,   0.        ,   0.        ,
          0.        ,   0.        ,   0.        ,   0.        ,
          0.        ,   0.        ,   0.        ,   0.        ,
          0.        ,   0.        ,   0.        ,   0.        ,
          0.        ,   0.        ,   0.        ,   0.        ,
         -4.3,      ,   0.        ,   0.        ,  -4.88      ,
          6.08,     ,   0         ,   9.05])

【问题讨论】:

    标签: python pandas list numpy indexing


    【解决方案1】:

    首先,如果我正确理解了您的问题,那么您的输出数组应该长一个元素,在 6.08 值和 9.05 值之间再加一个零,因为 9.05 应该在索引位置31(其他值匹配它们在digit_vals 中指定的索引位置)。 这个问题最难的部分是将digits_vals 数组中的信息转换为两个数组,这些数组正确索引到每个vals 数组列表,并转换到输出数组中的正确索引位置。 因为你已经在使用 numpy,所以我认为这是一个合理的方法

    val_ind = []
    out_ind = []
    for ind, cnt in enumerate(np.bincount(digit_vals)):
        if cnt > 0:
            val_ind.append(cnt-1)
            out_ind.append(ind)
    

    计算digits_vals 中每个值的出现次数,并将该计数(零索引减一)用作vals 数组中每个列表的索引。 digits_vals 中的每个唯一数字都是通过捕获具有非零计数的每个值的索引来标识的,假设 digits_vals 将按照问题示例中的说明进行排序。

    一旦构建了索引列表,就可以直接构建输出数组:

    out_arr = np.zeros(np.max(digit_vals)+1)
    for r_ind, (v_ind, o_ind) in enumerate(zip(val_ind, out_ind)):
        out_arr[o_ind] = vals[r_ind][v_ind]
    

    同样,枚举提供了行索引,用于从vals 数组中提取正确的行数据。我已经确认这会重现您提供的输出数组,包括上面提到的修复。希望我正确理解了您的问题,并做出了合理的假设。如果是这样,请更新您的问题,更详细地描述假设等。

    【讨论】:

    猜你喜欢
    • 2018-08-29
    • 2020-08-11
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 2021-11-07
    • 2015-02-14
    相关资源
    最近更新 更多