如何简洁删除DataFrame中含'..'空值占位符的行?
简洁删除含'..'空值的行
问题背景
我的数据集用'..'作为空值占位符,空值分布在所有列中,示例如下:
| 国家代码 | 年份 | GDP增长率(%) | 不变价GDP |
|---|---|---|---|
| AFG | 2010 | 3.5 | .. |
| AFG | 2011 | .. | 2345 |
| AFG | 2012 | 1.4 | 3372 |
| ALB | 2010 | .. | 4567 |
| ALB | 2011 | .. | 5678 |
| ALB | 2012 | 4.2 | .. |
| DZA | 2010 | 2.0 | 4321 |
| DZA | 2011 | .. | 5432 |
| DZA | 2012 | 3.8 | 6543 |
我需要删除所有包含'..'的行,但之前的方案都不够简洁:
- 尝试用
df_GDP_1[df_GDP_1.str.contains("..")==False]一次性处理所有列,直接报错; - 另一种方法要先改列名去掉空格,再写一堆
df_GDP_1.col1 != '..' | df_GDP_1.col2 != '..'的判断,流程太繁琐。
简洁解决方案
直接把自定义的空值占位符'..'替换成Pandas识别的标准缺失值pd.NA,再用dropna()一键删除含缺失值的行,完全不用处理列名或逐列判断:
import pandas as pd # 替换'..'为标准缺失值,然后删除含缺失值的行 df_GDP_1 = df_GDP_1.replace('..', pd.NA).dropna()
执行后,剩下的就是完全没有空值的行,对应示例里的结果是:
| 国家代码 | 年份 | GDP增长率(%) | 不变价GDP |
|---|---|---|---|
| AFG | 2012 | 1.4 | 3372 |
| DZA | 2010 | 2.0 | 4321 |
| DZA | 2012 | 3.8 | 6543 |
为什么之前的方法行不通?
df_GDP_1.str.contains("..")报错是因为:str.contains是Series的方法,DataFrame不能直接用;而且正则里.是通配符,要匹配字面的'..'得写成'\.\.',就算改成df_GDP_1.apply(lambda x: x.str.contains('\.\.')),后续筛选逻辑也比替换+dropna复杂。- 逐列判断的方法其实不用改列名,可以写成
df_GDP_1[(df_GDP_1['国家代码'] != '..') & (df_GDP_1['年份'] != '..') & ...],但列多的话写起来太麻烦,远不如上面的方法高效。
内容的提问来源于stack exchange,提问作者Niamh
相关产品推荐
相关产品推荐

