假设我有一个如下所示的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列中,以使它们的长度相同。
如果您认为标题更好,请随时进行编辑。
答案 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
然后用posR
和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