Pandas处理表格的基础操作2 —— 空值处理方法
书接上文,这次集中记录一下空值的处理方法,主要目的仍然是方便自己查阅,也为大家提供一个表格数据处理的范式。
仅供学习参考,转载请标明出处,作者也是小菜鸡,有更好的处理方式欢迎友好讨论~~~
1. 查询是否存在空值
使用df.isnull()
查看是否存在空值,此时会返回一个大小与表格大小相同的object,对应位置表示了表格中对应位置的空值情况,是True/False。如下图:
在数据量较大的情况下,这样的查询方式不够清晰,不能够帮助我们的判断。所以可以使用any()
和all()
函数来进行更易读的查询。其中any()
函数如其名,用于查询是否存在一个这样的例子(any),all()
用来查询是否全部(all)满足某性质。有了这样的背景知识后,我们可以做出更复杂更易读的空值查询,以下表为例进行说明:
1.1 关于列(columns)
1.1.1 某列是否存在空值
使用any()
函数,结果返回每一列是否存在空值的结果
# df是表格名
print(df.isnull().any())
1.1.2 某列是否全部为空值
使用all()
函数,结果返回每一列是否全部为空值的结果
# df是表格名
print(df.isnull().all())
1.1.3 取出空值所在列/全为空值的列
结合df.isnull().any()
/df.isnull().all()
函数和df.loc[:]
函数。
# df是表格名
print(df.loc[:,df.isnull().any()]) # 输出存在空值的列
print(df.loc[:,df.isnull().all()]) # 输出全为空值的列
在构造的表格中,结果如下。Age和Job两列存在空值。因为不存在全为空的列,所以输出empty dataframe。
1.2 关于行(index)
用df.isnull().T
将表格进行转置就可以得到类似的空值查询,这里就不再赘述。
# df是表格名
print(df.isnull().T.any()) # 查询每一行是否存在空值
print(df.isnull().T.all()) # 查询每一行是否全为空值
print(df[df.isnull().T.any()]) # 输出存在空值的行
print(df[df.isnull().T.all()]) # 输出全为空值的行
结果如下
1.3 其他
如果已经知道了想要查看的列名、行名,直接调取改行(列),再类比上述方法查看即可。
# 一个简单的例子
print(df['Age'].isnull().any())
2. 处理空值
在知道空值的位置之后,我们要如何对空值进行处理呢。通常是用删除空值和填空的方式进行处理。为了说明的方便,我们对以下表格进行说明。
2.1 删除
使用df.dropna()
进行删除,通过对参数进行不同赋值得到不同结果。其参数如下
- axis: 以列/行为单位进行删除。
axis = 0
或者axis = 'index'
则以行为单位进行删除;axis = 1
或者axis = 'columns'
则以列为单位进行删除。默认值为0。 - how:删除的方式。
how = 'any'
如果存在空值就删除;how = 'all'
如果全为空值就删除。 - thresh:能够允许的非空值数量,可以不填。
- inplace:波尔变量,是否修改原表格为删除后的表格。默认值为
False
- ignore_index:波尔变量,是否需要将留下来的index以0,1,2,…重新编号。默认值是
False
。
以下给出一些具体的例子
2.1.1 删除空值所在行
print(df.dropna())
因为全部行都有空值所以最后结果是一个空表。
2.1.2 删除全部为空值行
print(df.dropna(how = 'all'))
只有3
行全为空,被删除了
2.1.3 删除空值所在列
print(df.dropna(axis = 'columns'))
因为全部列都有空值所以最后结果是一个空表。
2.1.4 删除全部为空值列
print(df.dropna(axis = 'columns',how = 'all'))
只有 'Phone'
一列全为空,被删除
2.1.5 删除已一半以上为空值列
print(df.dropna(axis = 'columns',how = 'all',thresh = 0.5 * len(df)))
因为'Address'
和 'Phone'
两列空值都超过了2个(行数的一半),所以删除。
2.2 填空
使用df.fillna()
进行填空,对特定的行(列)直接指定行(列)进行填空。
2.2.1 填入指定值
# 全部填入'Unknown'
print(df.fillna('Unknown'))
print('-----------------------------------------------------')
# 在 'Phone' 列填入'Unknown‘'
df['Phone'] = df['Phone'].fillna('Unknown')
print(df)
结果如下
2.2.2 填入出现最多的值
通常是针对某列填入该列出现次数最多的值。只需同时使用df.fillna()
函数和df['Column_name'].value_counts().idxmax()
函数
df['Address'] = df['Address'].fillna(df['Address'].value_counts().idxmax())
print(df['Address'].value_counts().idxmax())
结果如下
2.2.3 按照比例填入值
有时候需要按照已有的数据比例,向空值中填入值。可以同时使用df.fill()
函数和np.random.choice(list, p, size)
函数。
其中np.random.choice(list, p = Proba_list, size = len(df))
函数以proba_list的比例从list中进行采样。
以下示例中以[0.3,0.7]
的概率分别填入['Shanghai','Beijing']
list = ['Shanghai','Beijing']
Proba_list = [0.3,0.7]
df['Address'] = df['Address'].fillna(pd.Series(np.random.choice(list, p = Proba_list,size = len(df))))
print(df)