如何一分钟内找出pandas DataFrame某列中的nan值
作者:六个橙子_lc
一分钟内找出pandas DataFrame某列中的nan值
例如
对格式为DataFrame的变量element,找出其中TEM列里所有的nan值
element=read_element(TRHCLO_data_path,end_trans,sta_info)
步骤一
element_right=element[~(np.isnan(element["TEM"]))] #(element["TEM"]).isna() element_nan=(element[np.isnan(element["TEM"])])
此时程序报错:
ufunc ‘isnan’ not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ‘‘safe’’
步骤二
对查询列(TEM列)的数据类型进行一次标准处理即可
element["TEM"]=(element["TEM"]).astype(float) #对下面的np.isnan查询很必要,否则会报格式错误 element_right=element[~(np.isnan(element["TEM"]))] element_nan=(element[np.isnan(element["TEM"])])
dataframe缺失值(NaN)处理
在进行机器学习的特征工程时,常常需要根据选择的机器学习算法,采用合适的数据预处理方式,特别是对于对于空值(NaN)的处理,常常使人感到困惑。
一般对于NaN,常常有两种处理方式。
- 第一种——填补
- 第二种——不处理
当你使用sklearn库进行机器学习训练时,一般对于缺失值要求较为严格,因此,需要进行填补,至于填补为何值,则需要根据业务需求进行。
当你使用lightgbm库一类库进行机器学习训练时,一般不需要处理缺失值,因为这类算法,天然支持缺失值处理,它会将缺失值单独分为一类。
本人认为,数据的缺失,在实际中是存在一定的业务含义的,例如月收入的缺失,就反应人对于自己收入的不自信,因此在风控领域就存在更容易逾期现象。但此时若是进行均值的缺失值填补,则会使该业务含义消失,因此我觉得是不可取的。
数据的特征工程决定数据质量,数据质量决定模型效果上限,模型参数决定训练的模型能否逼近理论模型,特征工程的难易复杂程度决定模型最终上线的工作量。
(以上为本人的一点点见解)
判断缺失值的函数有:np.isnan()/ pd.isna()/pd.isnull()。
- np.isnan():一般用于单个值,也可以用于Series或者DataFrame,但是这里存在一个坑,np.isnan()判断datetime类型的Series或者DataFrame会报错。
- pd.isna()和pd.isnull():用的比较多,一般推荐使用pd.isna()
s1 = pd.Series([1,2,3,np.nan]) np.isnan(s1) >>> 0 False 1 False 2 False 3 True dtype: bool pd.isna(s1) >>> 0 False 1 False 2 False 3 True dtype: bool pd.isnull(s1) >>> 0 False 1 False 2 False 3 True dtype: bool
除了以上的方法之外,还有一种较为方便和万能的方法来判断缺失值,取出非缺失值进行处理(本人一般也采用这种方法)。
通过对np.nan==np.nan发现,np.nan是不会等于np.nan,因此我们可以通过以下方式取出非缺失值。
np.nan==np.nan >>> False
s1 = pd.Series([1,2,3,np.nan]) s1==s1 >>> 0 True 1 True 2 True 3 False dtype: bool #获取非缺失值 s1[s1==s1] >>> 0 1.0 1 2.0 2 3.0 dtype: float64 #获取非缺失值的数量 len(s1[s1==s1]) >>>3 #对缺失值进行填补(除了fillna外的方式) s1[~(s1==s1)]=0 s1 >>> 0 1.0 1 2.0 2 3.0 3 0.0 dtype: float64
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。