如何通过循环在Pandas中查找各列NA并剔除含NA的行
用循环实现Pandas剔除所有含NA值的行
先还原你提供的原始DataFrame:
import pandas as pd import numpy as np # 构造数据字典 data = {'First Score':[100, 90, np.nan, 95], 'Second Score': [30, 45, 56, np.nan], 'Third Score':[np.nan, 40, 80, 98]} # 创建DataFrame df = pd.DataFrame(data)
循环实现的两种方式
方式1:逐行逐列遍历检查
这种方式完全贴合手动筛选的逻辑,逐个检查每一行的每一列是否存在NA:
# 初始化筛选掩码:默认所有行都保留 keep_rows = [True] * len(df) # 遍历每一列 for col in df.columns: # 遍历当前列的每一行 for idx in range(len(df)): # 如果当前行当前列是NA,标记为不保留 if pd.isna(df.loc[idx, col]): keep_rows[idx] = False # 应用掩码得到无NA的结果 final_df = df[keep_rows] print(final_df)
输出结果:
First Score Second Score Third Score 1 90.0 45.0 40.0
方式2:结合Pandas矢量化操作的循环(更高效)
这种方式避免逐行遍历,利用Pandas的列级非NA判断更新筛选掩码,效率更高:
# 初始化掩码为全True的Series,与DataFrame索引对应 keep_rows = pd.Series([True]*len(df), index=df.index) # 遍历每一列 for col in df.columns: # 保留同时满足「之前掩码为True」和「当前列非NA」的行 keep_rows = keep_rows & df[col].notna() # 获取最终结果 final_df = df[keep_rows]
补充:Pandas原生方法
虽然你已知其他方法,还是提一句:原生dropna()可以一步完成,逻辑和方式2一致,但无需手动写循环:
final_df = df.dropna()
内容的提问来源于stack exchange,提问作者manu p
相关产品推荐
相关产品推荐

