代码之家  ›  专栏  ›  技术社区  ›  d_kennetz

python熊猫在一列中检索值,而它们小于第二列的值

  •  1
  • d_kennetz  · 技术社区  · 6 年前

    假设我有一个这样的df:

       posF  ffreq  posR  rfreq
    0    10   0.50  11.0   0.08
    1    20   0.20  31.0   0.90
    2    30   0.03  41.0   0.70
    3    40   0.72  51.0   0.08
    4    50   0.09  81.0   0.78
    5    60   0.09   NaN    NaN
    6    70   0.01   NaN    NaN
    7    80   0.09   NaN    NaN
    8    90   0.08   NaN    NaN
    9   100   0.02   NaN    NaN
    

    在posr列中,我们看到它从11跳到31,在“20”中没有值。我想插入一个值来填充这个空间,它本质上就是 posF 价值,以及 NA ,所以我得到的df如下所示:

       posF  ffreq  posR  rfreq
    0    10   0.50  11.0   0.08
    1    20   0.20  20     NaN
    2    30   0.03  31.0   0.90
    3    40   0.72  41.0   0.70
    4    50   0.09  50     NaN
    5    60   0.09  60     NaN
    6    70   0.01  70     NaN
    7    80   0.09  80     NaN
    8    90   0.08  81.0   0.78
    9   100   0.02  100    NaN
    

    所以我想用位置中的NaN值填充 POSF 介于 posR .

    我尝试做的只是创建一个虚拟列表,并根据值是否小于a(我在这里看到了这个缺陷,但我不知道如何修复它)向列表中添加值。

    insert_rows = []
    for x in df['posF']:
        for a,b in zip(df['posR'], df['rfreq']):
            if x<a:
                insert_rows.append([x, 'NA'])
    print(len(insert_rows))#21, should be 5
    

    我意识到它在附加X多次,直到它达到存在的条件。

    在此之后,我将创建一个新的df,并将这些值添加到原始的2列中,使它们的长度相同。

    如果你能想出一个更好的标题,请随意编辑。

    1 回复  |  直到 6 年前
        1
  •  1
  •   SpghttCd    6 年前

    我的第一个想法是检索 posR 通过插入 posF 然后把这些价值观放到他们的新位置上——但正如你想要的那样 81 比这晚了一排,恐怕这不是你要找的,我仍然不知道你的任务背后的逻辑。
    然而,也许这是一个起点,让我们看看……

    这种方法的工作原理如下:

    检索中值的新索引位置 波斯尔 按照他们的顺序 POSF :

    import numpy as np
    idx = np.interp(df.posR, df.posF, df.index).round()
    

    摆脱 nan 条目和强制转换为int:

    idx = idx[np.isfinite(idx)].astype(int)
    

    通过复制创建新列 POSF 在第一步,设置 newrfreq 分别:

    df['newposR'] = df.posF
    df['newrfreq'] = np.nan
    

    然后用来自的值覆盖 波斯尔 rfreq ,但现在在更新的位置:

    df.loc[idx, 'newposR'] = df.posR[:len(idx)].values
    df.loc[idx, 'newrfreq'] = df.rfreq[:len(idx)].values
    

    结果:

       posF  ffreq  posR  rfreq  newposR  newrfreq
    0    10   0.50  11.0   0.08     11.0      0.08
    1    20   0.20  31.0   0.90     20.0       NaN
    2    30   0.03  41.0   0.70     31.0      0.90
    3    40   0.72  51.0   0.08     41.0      0.70
    4    50   0.09  81.0   0.78     51.0      0.08
    5    60   0.09   NaN    NaN     60.0       NaN
    6    70   0.01   NaN    NaN     70.0       NaN
    7    80   0.09   NaN    NaN     81.0      0.78
    8    90   0.08   NaN    NaN     90.0       NaN
    9   100   0.02   NaN    NaN    100.0       NaN