【问题标题】:How to find and replace values of even-positioned elements in sequence如何按顺序查找和替换偶数位置元素的值
【发布时间】:2020-08-20 06:26:09
【问题描述】:

我有一个列表如下:

list_1 = [12, 15, 18, 21, 6, 9, 7, 21, 38, 62, 65, 68, 81, 21, 25, 96, 101, 8, 11]

存在值的距离相等的元素序列。在此列表中,该距离为3,例如12, 15, 18, 21。

如何将每个序列/子列表的偶数定位元素的值替换为新值,例如 -1。输出将是:

list_2 = [12, -1, 18, -1, 6, -1, 7, 21, 38, 62, -1, 68, 81, 21, 25, 96, 101, 8, -1]

【问题讨论】:

    标签: python arrays pandas numpy dataframe


    【解决方案1】:

    对于基于 numpy 的方法,我们可以使用 np.diff 来查找数组的第一个差异,并通过取 np.arange 的 2 模来检查项目是否偶数。然后我们可以用bitwise AND链接这两个条件,并将切片分配回a:

    a = np.array([12, 15, 18, 21, 6, 9, 7, 21, 38, 62, 65, 68, 81, 21, 25, 96, 101, 8, 11])
    
    m = (np.diff(a)==3) & (np.arange(1,len(a))%2==1)
    a[1:] = np.where(m, -1, a[1:])
    

    print(a)
    array([ 12,  -1,  18,  -1,   6,  -1,   7,  21,  38,  62,  65,  -1,  81,
            21,  25,  96, 101,   8,  11])
    

    【讨论】:

      【解决方案2】:

      使用diff()

      s = pd.Series(list_1)
      s.loc[(s.diff() == 3) & (s.index % 2 == 1)] = -1
      

      产生

      [12, -1, 18, -1, 6, -1, 7, 21, 38, 62, 65, -1, 81, 21, 25, 96, 101, 8, 11]
      

      现在,如果您想要独立地与这些序列中的每个相关的偶数位置,请使用groupby 和cumcount

      s.loc[s.groupby(s.diff().ne(3).cumsum()).cumcount() % 2 == 1] = -1
      

      产生

      [12, -1, 18, -1, 6, -1, 7, 21, 38, 62, -1, 68, 81, 21, 25, 96, 101, 8, -1]
      

      区别将是您示例中的最后一个-1。第一个解决方案假定不应替换 11,因为它在您的 list_1 中的位置不均匀。第二种解决方案假定它应该被替换,因为它在 sublist [8, 11] 中处于偶数位置。

      【讨论】:

      • 成功了,谢谢。编辑问题以明确替换每个序列/子列表中的偶数元素
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多