# 处理丢失数据

• None
• np.nan(NaN)
In [1]:
```
import

numpy

as

np

```
In [12]:
```
%

timeit np.arange(0,10000,dtype=int).sum()

```

```                    21.3 µs ± 1.66 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

```
In [13]:
```
%

timeit np.arange(0,10000,dtype=float).sum()

```

```                    24.2 µs ± 2.7 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

```
In [14]:
```
%

timeit np.arange(0,10000,dtype=object).sum()

```

```                    679 µs ± 8.85 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

```

## 1. None

None是Python自带的，其类型为python object。因此，None不能参与到任何计算中。

object类型的运算要比int类型的运算慢得多

%timeit np.arange(1e5,dtype=xxx).sum()

In [14]:
```
%

timeit np.arange(1e5,dtype=int).sum()

```

```                    185 µs ± 24.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

```
In [15]:
```
%

timeit np.arange(1e5,dtype=float).sum()

```

```                    537 µs ± 24.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

```
In [16]:
```
%

timeit np.arange(1e5,dtype=object).sum()

```

```                    6.36 ms ± 180 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

```

## 2. np.nan（NaN）

np.nan是浮点类型，能参与到计算中。但计算的结果总是NaN。

In [ ]:

## 3. pandas中的None与NaN

### 1) pandas中None与np.nan都视作np.nan

In [15]:
```
import

pandas

as

pd

from

pandas

import

Series

,

DataFrame

```
In [19]:
```
df

=

DataFrame

({

'age'

:[

20

,

21

,

23

,

19

,

22

],

'salary'

:[

10000

,

11000

,

9900

,

8500

,

15000

]},

index

=

[

'张三'

,

'李四'

,

'小昭'

,

'小郭'

,

'小齐'

],

columns

=

[

'age'

,

'salary'

,

'work'

])

df

```
Out[19]:
age salary work

In [21]:
```
df

.

work

[

'李四'

:

'小郭'

]

=

'python'

```

```                    C:\Users\BLX\AppData\Roaming\Python\Python37\site-packages\ipykernel_launcher.py:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
"""Entry point for launching an IPython kernel.

```
In [22]:
```
df

```
Out[22]:
age salary work

### 2) pandas中None与np.nan的操作

• ``` isnull() ```
• ``` notnull() ```
• ``` dropna() ``` : 过滤丢失数据
• ``` fillna() ``` : 填充丢失数据
In [ ]:

(1)判断函数

• ``` isnull() ```
• ``` notnull() ```
In [27]:
```
# 根据获得的数据去除原来数据的空数据

s1

=

df

.

isnull

()

.

any

(

axis

=

1

)

```
In [29]:
```
# 有了s1这个数据，可以获得哪些数据为空

df

[

s1

]

```
Out[29]:
age salary work

In [33]:
```
# 保留非空数据

# .all()判断轴中所有数据都不为空，返回True

s2

=

df

.

notnull

()

.

all

(

axis

=

1

)

```
In [34]:
```
df

[

s2

]

```
Out[34]:
age salary work

(2) 过滤函数

• ``` dropna() ```

#### 可以选择过滤的是行还是列（默认为行）

In [38]:
```
df

.

dropna

()

```
Out[38]:
age salary work

In [37]:
```
df

.

dropna

(

axis

=

1

)

```
Out[37]:
age salary

#### 也可以选择过滤的方式 how = 'all',一行中所有数据为空才删除

In [39]:
```
df

.

dropna

(

how

=

'all'

)

```
Out[39]:
age salary work

In [42]:
```
df

.

loc

[

'张三'

]

=

np

.

nan

df

```
Out[42]:
age salary work

In [43]:
```
df

.

dropna

(

how

=

'all'

)

```
Out[43]:
age salary work

(3) 填充函数 Series/DataFrame

• ``` fillna() ```
In [47]:
```
# 对多有的空数据进行替换

df

.

fillna

(

value

=

'Java'

)

```
Out[47]:
age salary work

In [49]:
```
df

.

fillna

(

method

=

'bfill'

)

```
Out[49]:
age salary work

In [50]:
```
df

.

fillna

(

method

=

'ffill'

)

```
Out[50]:
age salary work

• axis=0：index/行
• axis=1：columns/列
In [51]:
```
#{'backfill', 'bfill', 'pad', 'ffill'

df

.

fillna

(

method

=

'ffill'

)

```
Out[51]:
age salary work

In [ ]:

============================================

1. 简述None与NaN的区别

2. 假设张三李四参加模拟考试，但张三因为突然想明白人生放弃了英语考试，因此记为None，请据此创建一个DataFrame,命名为ddd3

3. 老师决定根据用数学的分数填充张三的英语成绩，如何实现？ 用李四的英语成绩填充张三的英语成绩？

============================================

QQ号联系： 360901061

【本文对您有帮助就好】