删除缺失值

阅读: 5051     评论:1

在进行数据分析和建模的过程中,我们80%的时间往往花在数据准备上:加载、清理、转换、处理和重新排列。为了提高这一过程的效率,Pandas提供了一系列的高级、灵活和快速的工具集,配合Python语言内置的处理功能,可以满足绝大多数场景下的使用需求。

Pandas中,使用numpy.nan标识缺失值,在打印的时候,经常以空字符串、NA、NaN、NULL等形式出现。Python内置的None值也被当作缺失值处理。但合法的缺失值只有NaN和None,另外一些我们自己定义的缺失值不属于语法上的,比如你将-999看作缺失值。

在Pandas中, None和NaN的区别:

  • None被看作一个object对象,需要消耗更多的资源,处理速度更慢。不支持一些数学操作,因为None+数字是错误的语法。很多时候None会自动转换成NaN。
  • NaN是float64类型,虽然名字叫做‘不是一个数’,但却属于数字类,可以进行数学运算不会报错,虽然所有和它进行计算的最终结果依然是NaN。它的运算速度更快,还支持全局性的操作。

以下是主要的缺失值处理方法:

  • dropna:删除缺失值
  • fillna: 用某些值填充缺失的数据或使用插值方法(比如ffill\bfill)
  • isnull:判断哪些值是缺失值,返回布尔
  • notnull:isnull的反函数

通常使用dropna方法滤删除缺失值,默认它不直接修改数据,而是返回一个新对象。如果想原地修改,举一反三,请尝试inplace参数:

In [12]: from numpy import nan as NA  # 导入惯例

In [13]: s = pd.Series([1, NA, 3.5, NA, 7])

In [14]: s
Out[14]:
0    1.0
1    NaN
2    3.5
3    NaN
4    7.0
dtype: float64

In [15]: s.dropna()  # 本质上就是把缺失值删除
Out[15]:
0    1.0
2    3.5
4    7.0
dtype: float64

In [16]: s[s.notnull()]  # 等同于上面的操作
Out[16]:
0    1.0
2    3.5
4    7.0
dtype: float64

在处理DataFrame对象的缺失值的时候,可能会复杂点。无法删除df的单个元素,只能整行整列的删除,dropna默认情况下会删除包含缺失值的行!为什么呢?因为DataFrame对象的每一行数据,在实际中,相当于一个样本,大量的样本中删除了一条,关系不大。但DataFrame对象的每一列相当于大量样本中共同的某个特征的值,如果删除了一个特征,那么对整个样本集的影响非常大。

In [20]: df = pd.DataFrame([[1, 6.5, 3],[1, NA, NA],[NA, NA, NA],[NA, 6.5,3]])

In [21]: df
Out[21]:
     0    1    2
0  1.0  6.5  3.0
1  1.0  NaN  NaN
2  NaN  NaN  NaN
3  NaN  6.5  3.0

In [22]: df.dropna() # 只剩1行了
Out[22]:
     0    1    2
0  1.0  6.5  3.0

In [23]: df.dropna(how='all') # 只将整行都是缺失值的删除
Out[23]:
     0    1    2
0  1.0  6.5  3.0
1  1.0  NaN  NaN
3  NaN  6.5  3.0

In [24]: df[4] = NA  # 新增一列全是缺失值

In [25]: df
Out[25]:
     0    1    2   4
0  1.0  6.5  3.0 NaN
1  1.0  NaN  NaN NaN
2  NaN  NaN  NaN NaN
3  NaN  6.5  3.0 NaN

In [26]: df.dropna(axis=1, how='all') # 指定以列的形式删除
Out[26]:
     0    1    2
0  1.0  6.5  3.0
1  1.0  NaN  NaN
2  NaN  NaN  NaN
3  NaN  6.5  3.0

注意上面axis和how参数的用法。

还可以通过thresh参数设置行或列中非缺失值的最小数量,在此数量以下的将被删除。


 数据库交互 补全缺失值 

评论总数: 1


点击登录后方可评论

DataFrame类似于表,优先删除行缺失值。