处理丢失数据
有两种丢失数据:
- None
- np.nan(NaN)
import
numpy
as
np
%
timeit np.arange(0,10000,dtype=int).sum()
%
timeit np.arange(0,10000,dtype=float).sum()
%
timeit np.arange(0,10000,dtype=object).sum()
1. None
None是Python自带的,其类型为python object。因此,None不能参与到任何计算中。
object类型的运算要比int类型的运算慢得多
计算不同数据类型求和时间
%timeit np.arange(1e5,dtype=xxx).sum()
%
timeit np.arange(1e5,dtype=int).sum()
%
timeit np.arange(1e5,dtype=float).sum()
%
timeit np.arange(1e5,dtype=object).sum()
2. np.nan(NaN)
np.nan是浮点类型,能参与到计算中。但计算的结果总是NaN。
但可以使用np.nan*()函数来计算nan,此时视nan为0。
3. pandas中的None与NaN
1) pandas中None与np.nan都视作np.nan
创建DataFrame
import
pandas
as
pd
from
pandas
import
Series
,
DataFrame
df
=
DataFrame
({
'age'
:[
20
,
21
,
23
,
19
,
22
],
'salary'
:[
10000
,
11000
,
9900
,
8500
,
15000
]},
index
=
[
'张三'
,
'李四'
,
'小昭'
,
'小郭'
,
'小齐'
],
columns
=
[
'age'
,
'salary'
,
'work'
])
df
df
.
work
[
'李四'
:
'小郭'
]
=
'python'
df
使用DataFrame行索引与列索引修改DataFrame数据
2) pandas中None与np.nan的操作
-
isnull()
-
notnull()
-
dropna()
: 过滤丢失数据 -
fillna()
: 填充丢失数据
(1)判断函数
-
isnull()
-
notnull()
# 根据获得的数据去除原来数据的空数据
s1
=
df
.
isnull
()
.
any
(
axis
=
1
)
# 有了s1这个数据,可以获得哪些数据为空
df
[
s1
]
# 保留非空数据
# .all()判断轴中所有数据都不为空,返回True
s2
=
df
.
notnull
()
.
all
(
axis
=
1
)
df
[
s2
]
(2) 过滤函数
-
dropna()
可以选择过滤的是行还是列(默认为行)
df
.
dropna
()
df
.
dropna
(
axis
=
1
)
也可以选择过滤的方式 how = 'all',一行中所有数据为空才删除
df
.
dropna
(
how
=
'all'
)
df
.
loc
[
'张三'
]
=
np
.
nan
df
df
.
dropna
(
how
=
'all'
)
(3) 填充函数 Series/DataFrame
-
fillna()
# 对多有的空数据进行替换
df
.
fillna
(
value
=
'Java'
)
可以选择前向填充还是后向填充
df
.
fillna
(
method
=
'bfill'
)
df
.
fillna
(
method
=
'ffill'
)
对于DataFrame来说,还要选择填充的轴axis。记住,对于DataFrame来说:
- axis=0:index/行
- axis=1:columns/列
#{'backfill', 'bfill', 'pad', 'ffill'
df
.
fillna
(
method
=
'ffill'
)
============================================
练习7:
-
简述None与NaN的区别
-
假设张三李四参加模拟考试,但张三因为突然想明白人生放弃了英语考试,因此记为None,请据此创建一个DataFrame,命名为ddd3
-
老师决定根据用数学的分数填充张三的英语成绩,如何实现? 用李四的英语成绩填充张三的英语成绩?
============================================