pandas - 如何通过循环使用 Pandas DataFrame 中相邻列的平均值填充 NaN 值
问题描述
我有一个大数据集,并且我有一些缺失值,我想用前后列的平均值填充 NAN 值,在某些情况下,我有连续的 NaN 值,在这些情况下我想替换所有这些 nan例如,可以找到非 nan 的第一个值的值:我应该使用循环
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
19.0 NaN NaN NaN 29.0 30.0 NaN 16.0 15.0 16.0 17.0 NaN 28.0 30.0 NaN 28.0 18.0
目标是让数据看起来像这样:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
19.0 29.0 29.0 29.0 29.0 30.0 23.0 16.0 15.0 16.0 17.0 22.5 28.0 30.0 29 28.0 18.0
解决方案
我们试试看:
# where df is not null
s = df.notna()
# check for `NaN` with valid left and right:
mask = s.shift(1, axis=1) & s.shift(-1, axis=1)
# fill as required
df[:] = np.where(mask, df.interpolate(axis=1), df.bfill(axis=1).ffill(axis=1))
输出:
0 1 2 3 4 5 6 7 8 9 10 11 \
0 19.0 29.0 29.0 29.0 29.0 30.0 23.0 16.0 15.0 16.0 17.0 22.5
12 13 14 15 16
0 28.0 30.0 29.0 28.0 18.0
推荐阅读
- qml - 在 Qml 中创建类似 kicker 的子菜单
- android - Android:AVD的模拟器进程被杀死
- symfony - 在链配置的命名空间 App\Entity 中找不到类“DateTime”
- python - 如何使用 Google 的 Python Drive Client API 在 Team Drive 中创建文件夹?
- mysql - 如何确定是否有超过 4 行的值?(业余)
- .net - 无法推送 Nuget 的 GitHub 包
- c# - 获取几个 int 参数的最大值
- python - 如何缩短接收训练样本的运行时间?
- reactjs - 在道具中传递对象,使用打字稿的reactjs
- erlang - 如何使 genserver 以频率值运行 Elixir