如何在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
相关产品推荐
相关产品推荐

