为含缺失值的行创建标记列——Pandas技术咨询
解决方法:给DataFrame新增全非NaN标记列
其实这个需求用Pandas的内置方法就能轻松搞定,而且比你用apply的方式更高效,先给你最简便的实现方式,再聊聊你提到的count方法能不能用。
最推荐的简便方法:利用向量化操作
Pandas里有专门的方法可以直接判断每行是否所有值都非NaN,一行代码就能搞定:
import pandas as pd # 示例DataFrame df = pd.DataFrame({ 'col1': [1, 2, None, 4], 'col2': [5, None, 7, 8], 'col3': [9, 10, 11, 12] }) # 新增标记列:全非NaN返回1,否则返回0 df['is_complete'] = df.notna().all(axis=1).astype(int)
解释一下:
df.notna():把整个DataFrame转换成布尔值矩阵,非NaN值为True,NaN为False.all(axis=1):沿着行的方向判断,只要一行里所有值都是True(全非NaN),就返回True,否则False.astype(int):把布尔值转换成整数,True变1,False变0
这种方法是向量化操作,Pandas内部做了优化,比逐行遍历的apply快得多,尤其是数据量大的时候优势明显。
你提到的count方法是否可行?
当然可以用!思路是:统计每行非NaN值的数量,如果这个数量等于DataFrame的总列数,说明该行没有NaN,返回1,否则返回0。代码实现如下:
df['is_complete'] = (df.count(axis=1) == df.shape[1]).astype(int)
不过这种方法需要先统计每行的非NaN数量,再和总列数比较,相比上面的notna().all(),效率会稍低一点——因为all()只要遇到第一个NaN就会停止判断,而count()需要遍历完一行所有元素统计数量。如果你的数据量不大,两种方法差异不大,但数据量大的话更推荐第一种。
对比两种方法的结果
运行上面的代码后,示例DataFrame的结果会是:
| col1 | col2 | col3 | is_complete |
|---|---|---|---|
| 1.0 | 5.0 | 9 | 1 |
| 2.0 | NaN | 10 | 0 |
| NaN | 7.0 | 11 | 0 |
| 4.0 | 8.0 | 12 | 1 |
完全符合你的需求~
内容的提问来源于stack exchange,提问作者TC1111
相关产品推荐
相关产品推荐

