Pandas处理表格的基础操作2 —— 空值处理方法

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)

在这里插入图片描述

这次Pandas的控制处理操作就写到这里。希望本文对小伙伴们有帮助,欢迎友好讨论~~

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值