在进行数据分析和建模的过程中,我们80%的时间往往花在数据准备上:加载、清理、转换、处理和重新排列。为了提高这一过程的效率,Pandas提供了一系列的高级、灵活和快速的工具集,配合Python语言内置的处理功能,可以满足绝大多数场景下的使用需求。
Pandas中,使用numpy.nan标识缺失值,在打印的时候,经常以空字符串、NA、NaN、NULL等形式出现。Python内置的None值也被当作缺失值处理。但合法的缺失值只有NaN和None,另外一些我们自己定义的缺失值不属于语法上的,比如你将-999看作缺失值。
在Pandas中, None和NaN的区别:
以下是主要的缺失值处理方法:
通常使用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参数设置行或列中非缺失值的最小数量,在此数量以下的将被删除。
DataFrame类似于表,优先删除行缺失值。