You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在pandas DataFrame中将全NaN行移动到指定位置?

问题描述

我们首先有如下df对象,其中部分行是全NaN值:

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.randint(0, 10, (10, 4)))
df.iloc[[3, 6, 8], :] = np.nan

print(df)

输出:

0    1    2    3
0  4.0  1.0  9.0  3.0
1  8.0  1.0  8.0  0.0
2  0.0  6.0  5.0  6.0
3  NaN  NaN  NaN  NaN
4  3.0  9.0  9.0  4.0
5  1.0  5.0  5.0  3.0
6  NaN  NaN  NaN  NaN
7  3.0  4.0  1.0  4.0
8  NaN  NaN  NaN  NaN
9  8.0  9.0  8.0  5.0

现在需要依据另一个布尔类型的DataFramenan_df,将df中所有全为NaN的行移动到nan_df中全为True的行对应的位置,不能覆盖df中任何非NaN的原有行:

nan_df = pd.DataFrame(data=np.zeros([10, 4])).astype(bool)
nan_df.iloc[[2, 4, 9], :] = True

print(nan_df)

输出:

0      1      2      3
0  False  False  False  False
1  False  False  False  False
2   True   True   True   True
3  False  False  False  False
4   True   True   True   True
5  False  False  False  False
6  False  False  False  False
7  False  False  False  False
8  False  False  False  False
9   True   True   True   True

预期输出结果:

0    1    2    3
0  4.0  1.0  9.0  3.0
1  8.0  1.0  8.0  0.0
2  NaN  NaN  NaN  NaN
3  0.0  6.0  5.0  6.0
4  NaN  NaN  NaN  NaN
5  3.0  9.0  9.0  4.0
6  1.0  5.0  5.0  3.0
7  3.0  4.0  1.0  4.0
8  8.0  9.0  8.0  5.0
9  NaN  NaN  NaN  NaN

补充说明:df中的全NaN行数量和nan_df中全为True的行数量始终一致。

实现方案

核心逻辑:先提取出df里所有非全NaN的行,再把这些非空行填到nan_df里全为False的位置,nan_df全为True的位置统一填NaN即可,代码如下:

# 1. 提取df中所有非全NaN的行
non_nan_rows = df[~df.isna().all(axis=1)]
# 2. 确定nan_df中需要填非空值的位置(全为False的行)
fill_pos = ~nan_df.all(axis=1)
# 3. 初始化结果df,默认全为NaN
res = pd.DataFrame(np.nan, index=df.index, columns=df.columns)
# 4. 将非空行填入对应位置
res.loc[fill_pos, :] = non_nan_rows.values

print(res)

运行后即可得到符合要求的输出。

内容的提问来源于stack exchange,提问作者Andi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 15:27:01