揭秘Pandas:缺失值处理的深度探索与实战技巧

在这里插入图片描述

导包

import numpy as np
import pandas as pd

有两种丢失数据(空值):

  • None
  • np.nan

1.None

  • None是Python自带的,是Python中的空对象。None不能参与到任何计算中。
  • object类型的运算要比int类型的运算慢得多
%timeit np.arange(1e6,dtype=object).sum()
114 ms ± 1.61 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit np.arange(1e6,dtype=np.int32).sum()
3.81 ms ± 103 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

2. np.nan

  • np.nan是浮点类型,能参与到计算中,但计算的结果总是NaN
type(np.nan)
float
  • 但可以使用np.nan*()函数来计算nan,此时会过滤掉nan
n = np.array([1,2,3,np.nan,5,6])
n
array([ 1.,  2.,  3., nan,  5.,  6.])
np.sum(n)
nan
# 自动过滤nan不计算
np.nansum(n)
17.0
np.nan + 10
nan

3.Pandas中的None与NaN

(1)Pandas中None与np.nan都视作np.nan

  • 创建DataFrame
data = np.random.randint(0,100,size=(5,5))
df = pd.DataFrame(data=data,columns=list("ABCDE"))
df
ABCDE
0608117582
1966927575
25098246077
31254166211
4262203167
df.loc[2,"B"] = np.nan
df.loc[3,"C"] = None
df
ABCDE
06081.01.07582
1966.092.07575
250NaN24.06077
31254.0NaN6211
4262.020.03167
df.loc[2,"B"],df.loc[3,"C"]
(nan, nan)

(2)Pandas中None与np.nan的操作

  • 判断函数
    • isnull()
    • notnull()
df
ABCDE
06081.01.07582
1966.092.07575
250NaN24.06077
31254.0NaN6211
4262.020.03167
df.isnull()
ABCDE
0FalseFalseFalseFalseFalse
1FalseFalseFalseFalseFalse
2FalseTrueFalseFalseFalse
3FalseFalseTrueFalseFalse
4FalseFalseFalseFalseFalse
df.notnull()
ABCDE
0TrueTrueTrueTrueTrue
1TrueTrueTrueTrueTrue
2TrueFalseTrueTrueTrue
3TrueTrueFalseTrueTrue
4TrueTrueTrueTrueTrue
# all():必须全部为True才会是True,类似and
# any():只要有一个为True就为True,类似or

# 找有空值的列(常用,尽可能找到有空的列)
df.isnull().any()
A    False
B     True
C     True
D    False
E    False
dtype: bool
# 必须全部都为空的行或列才会为True
df.isnull().all()
A    False
B    False
C    False
D    False
E    False
dtype: bool
# 找没有空的列(常用,尽量找没有空值的列或行)
df.notnull().all()
A     True
B    False
C    False
D     True
E     True
dtype: bool
# 只要有不为空的行或列就为True
df.notnull().any()
A    True
B    True
C    True
D    True
E    True
dtype: bool
# 找有空的行
df.isnull().any(axis=1)
0    False
1    False
2     True
3     True
4    False
dtype: bool
# 找没有空的行
df.notnull().all(axis=1)
0     True
1     True
2    False
3    False
4     True
dtype: bool
  • 使用bool值索引过滤数据
# 过滤数据
df
ABCDE
06081.01.07582
1966.092.07575
250NaN24.06077
31254.0NaN6211
4262.020.03167
# 过滤行
# 方式一
cond = df.isnull().any(axis=1)
# 取反
display(~cond)
df[~cond]
0     True
1     True
2    False
3    False
4     True
dtype: bool
ABCDE
06081.01.07582
1966.092.07575
4262.020.03167
# 方式二
cond = df.notnull().all(axis=1)
df[cond]
ABCDE
06081.01.07582
1966.092.07575
4262.020.03167
# 过滤列
# 方式一
cond = df.isnull().any()
df.loc[:,~cond]
ADE
0607582
197575
2506077
3126211
423167
# 方式二
cond = df.notnull().all()
df.loc[:,cond]
ADE
0607582
197575
2506077
3126211
423167
  • 过滤函数
    • dropna():过滤丢失数据

可以选择过滤的是行还是列(默认为行)

df
ABCDE
06081.01.07582
1966.092.07575
250NaN24.06077
31254.0NaN6211
4262.020.03167
# 默认删除有空的行
df.dropna()
ABCDE
06081.01.07582
1966.092.07575
4262.020.03167
# 删除有空的列
df.dropna(axis=1)
ADE
0607582
197575
2506077
3126211
423167

也可以选择过滤的方式 how = “all”

df.dropna(how="any")
ABCDE
06081.01.07582
1966.092.07575
4262.020.03167
# 必须行的所有数据都为nan才会删除
df.dropna(how="all")
ABCDE
06081.01.07582
1966.092.07575
250NaN24.06077
31254.0NaN6211
4262.020.03167
# 必须列的所有数据都为nan才会删除
df.dropna(how="all",axis=1)
ABCDE
06081.01.07582
1966.092.07575
250NaN24.06077
31254.0NaN6211
4262.020.03167

inplace=True 修改原数据

df2 = df.copy()
df2
ABCDE
06081.01.07582
1966.092.07575
250NaN24.06077
31254.0NaN6211
4262.020.03167
# inplace=True 修改原数据
df2.dropna(inplace=True)
df2
ABCDE
06081.01.07582
1966.092.07575
4262.020.03167

(3)填充函数 Series/DataFrame

  • fillna():填充丢失数据
# 创建DataFrame
data = np.random.randint(0,100,size=(5,5))
df = pd.DataFrame(data=data,columns=list("ABCDE"))
df

df.loc[2,"B"] = np.nan
df.loc[3,"C"] = None
df
ABCDE
06083.094.08224
12493.037.01445
252NaN72.03627
35170.0NaN6813
41151.057.02094
# 填充nan
df.fillna(value=100)
ABCDE
06083.094.08224
12493.037.01445
252100.072.03627
35170.0100.06813
41151.057.02094
df2 = df.copy()
df2.loc[1,"B"] = np.nan
df2.loc[2,"C"] = np.nan
df2
ABCDE
06083.094.08224
124NaN37.01445
252NaNNaN3627
35170.0NaN6813
41151.057.02094
# limit:限制填充的次数
df2.fillna(value=100,limit=1,inplace=True)
df2
ABCDE
06083.094.08224
124100.037.01445
252NaN100.03627
35170.0NaN6813
41151.057.02094

可以选择向前填充还是向后填充

df
ABCDE
06083.094.08224
12493.037.01445
252NaN72.03627
35170.0NaN6813
41151.057.02094
# method : {'backfill', 'bfill', 'ffill', None}, default None
#     Method to use for filling holes in reindexed Series:

#     * ffill: propagate last valid observation forward to next valid.
#     * backfill / bfill: use next valid observation to fill gap.
# ffill:向前填充
df.fillna(method="ffill")
ABCDE
06083.094.08224
12493.037.01445
25293.072.03627
35170.072.06813
41151.057.02094
# backfill:向后填充
df.fillna(method="backfill")
ABCDE
06083.094.08224
12493.037.01445
25270.072.03627
35170.057.06813
41151.057.02094
# ffill:向左填充
df.fillna(method="ffill",axis=1)
ABCDE
060.083.094.082.024.0
124.093.037.014.045.0
252.052.072.036.027.0
351.070.070.068.013.0
411.051.057.020.094.0
# backfill:向右填充
df.fillna(method="backfill",axis=1)
ABCDE
060.083.094.082.024.0
124.093.037.014.045.0
252.072.072.036.027.0
351.070.068.068.013.0
411.051.057.020.094.0
  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

腾飞开源

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值