我有一个如下所示的数据框:
A B
10 NaN
NaN 20
NaN NaN
NaN NaN
NaN NaN
NaN 50
20 NaN
NaN 30
NaN NaN
30 30
40 NaN
NaN 10
这里我需要为 A 列的每个非 NaN 值返回上一个和下一个 B 列值。
我使用的代码是:
df['prev_b'] = NP.where(df['A'].notna(), df['B'].shift(-1),NP.nan)
df['next_b'] = NP.where(df['A'].notna(), df['B'].shift(1),NP.nan)
所需的输出是:
A B prev_b next_b
10 NaN NaN 20
NaN 20 NaN NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
NaN 50 NaN Nan
20 NaN 50 30
NaN 30 NaN NaN
NaN NaN NaN NaN
30 30 30 30
40 NaN 30 10
NaN 10 NaN NaN
有人帮我纠正我的逻辑。
答案 0 :(得分:3)
在你的 numpy where 中使用向前或向后填充;它应该正确对齐以获得您的下一个/上一个非 nan 值:
df.assign(
prev_b=np.where(df.A.notna(), df.B.ffill(), np.nan),
next_b=np.where(df.A.notna(), df.B.bfill(), np.nan),
)