Python Pandas检索一列中的值,但小于第二列中的值

时间:2019-02-06 23:41:07

标签: python pandas

假设我有一个如下所示的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

所以我想用posF中的值之间的posR中的值来填充位置中的NaN值。

我试图做的只是制作一个虚拟列表,并根据它们是否小于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,直到达到> a的条件。

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

如果您认为标题更好,请随时进行编辑。

1 个答案:

答案 0 :(得分:1)

我的第一个想法是通过对posR进行插值来获取posF中条目的新索引,然后将值放到它们的新位置-但您想拥有81比这里晚一排,恐怕这并不是您要查找的内容,而且我仍然没有真正理解您的任务背后的逻辑。
但是,也许这是一个起点,让我们看看...

这种方法将如下所示工作:

根据posR中的值在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分别设置为nan

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

然后用posRrfreq中的值覆盖,但现在位于更新的位置:

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