如何删除Pandas DataFrame中含指定列空值的整类数据
解决Pandas中删除含空值的整本书所有条目的问题
问题描述
假设有如下Pandas DataFrame:
| book | page | words_per_page | characters |
|---|---|---|---|
| Book 1 | 1 | 27 | NaN |
| Book 1 | 2 | NaN | 30 |
| Book 1 | 2 | 30 | 25 |
| Book 2 | 1 | 30 | 26 |
| Book 2 | 2 | 28 | 30 |
需求是:删除那些在words_per_page或characters列中至少存在一个空值的整本书的所有条目。比如上述场景中,Book 1存在空值,需要删除它的所有相关行。要求使用直接在DataFrame上操作的高效方法,避免外部if语句,适配大数据量场景。
高效解法
可以通过Pandas的分组和向量化运算实现,全程内部操作,无需外部循环:
import pandas as pd import numpy as np # 构造示例DataFrame df = pd.DataFrame({ 'book': ['Book 1', 'Book 1', 'Book 1', 'Book 2', 'Book 2'], 'page': [1, 2, 2, 1, 2], 'words_per_page': [27, np.nan, 30, 30, 28], 'characters': [np.nan, 30, 25, 26, 30] }) # 步骤1:标记每行所在书籍是否在目标列存在空值 has_null = df.groupby('book')[['words_per_page', 'characters']].transform(lambda x: x.isnull().any()) # 步骤2:生成保留行的掩码(所在书籍无任何空值的行) mask = ~has_null.any(axis=1) # 步骤3:筛选得到结果 result_df = df[mask] print(result_df)
代码说明
groupby('book').transform(...):按书籍分组后,将每组的空值检查结果广播到组内每一行,生成与原DataFrame同结构的布尔矩阵,标记每行所在组的对应列是否有null。has_null.any(axis=1):对每行的两个列的布尔值取逻辑或,得到该行所在书籍是否在任意目标列存在空值。~mask取反后,筛选出所有所在书籍无空值的行,最终得到符合要求的DataFrame。
这种方法利用Pandas的向量化特性,处理大数据量时效率远高于循环或外部判断,完全满足性能要求。
内容的提问来源于stack exchange,提问作者OanaB
相关产品推荐
相关产品推荐

