上节课我们讲到了如何从 Series 对象或 DataFrame 对象中提取数据。

image.png

在进行数据分析的时候,数据集中往往会包含有缺失值。在 pandas 中,用两个值来表示缺失值,一个是 None,一个是 NaN(Not a Number)。本节课我们就来讲下如何处理缺失的数据。

# 1.检测缺失数据

我们可以使用 isnull() 和 notnull() 来检测 Series 对象 或 DataFrame 对象中的缺失数据。

# 1.1 使用 isnull()

import pandas as pd
import numpy as np

my_series = pd.Series(np.array([4, -7, 6, -5, 3, 2, np.NaN, 8, 1, -9]))

print(my_series.isnull())
1
2
3
4
5
6

上面代码中,my_series 中有一个缺失值,调用 isnull() 函数后,缺失值对应的输出为 True。其他非缺失值对应的输出为 False。

import pandas as pd
import numpy as np

d = {
    "Open": pd.Series([136, 137, 140, 143, 141, 142, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "High": pd.Series([137, 140, 143, 144, np.NaN, 145, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Low": pd.Series([135, 137, 140, np.NaN, 140, 142, 144], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Close": pd.Series([137, np.NaN, 142, 144, 143, 145, 144], index = ['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12'])
}

df = pd.DataFrame(d)

print(df.isnull())
1
2
3
4
5
6
7
8
9
10
11
12
13

上面代码中,对 df 使用 isnull() 函数后,缺失值对应的输出为 True。其他非缺失值对应的输出为 False。

# 1.2 使用 notnull()

import pandas as pd
import numpy as np

my_series = pd.Series(np.array([4, -7, 6, -5, 3, 2, np.NaN, 8, 1, -9]))

print(my_series.notnull())
1
2
3
4
5
6

上面代码中,对 my_series 使用 notnull() 函数后,缺失值对应的输出为 False。其他非缺失值对应的输出为 True。

import pandas as pd
import numpy as np

d = {
    "Open": pd.Series([136, 137, 140, 143, 141, 142, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "High": pd.Series([137, 140, 143, 144, np.NaN, 145, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Low": pd.Series([135, 137, 140, np.NaN, 140, 142, 144], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Close": pd.Series([137, np.NaN, 142, 144, 143, 145, 144], index = ['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12'])
}

df = pd.DataFrame(d)

print(df.notnull())
1
2
3
4
5
6
7
8
9
10
11
12
13

上面代码中,对 df 使用 notnull() 函数后,缺失值对应的输出为 False。其他非缺失值对应的输出为 True。

# 2.去除缺失数据

我们可以使用 dropna() 去除缺失的数据。

# 2.1 去除至少包含一个缺失值的行或列

# 2.1.1 行的去除

import pandas as pd
import numpy as np

d = {
    "Open": pd.Series([136, 137, 140, 143, np.NaN, 142, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "High": pd.Series([137, 140, np.NaN, 144, np.NaN, 145, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Low": pd.Series([135, 137, 140, np.NaN, 140, 142, 144], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Close": pd.Series([137, np.NaN, 142, 144, 143, 145, 144], index = ['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12'])
}

df = pd.DataFrame(d)

# 去除前
print(df)

# 去除后
print(df.dropna())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

上面代码中,对 df 使用 dropna(),对至少包含一个缺失值的行进行去除。

# 2.1.2 列的去除

默认是行的去除,当我们传入参数 axis=1 时,便是对列进行去除。例如:

import pandas as pd
import numpy as np

d = {
    "Open": pd.Series([136, 137, 140, 143, 143, 142, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "High": pd.Series([137, np.NaN, np.NaN, 144, np.NaN, 145, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Low": pd.Series([135, 137, 140, np.NaN, np.NaN, 142, 144], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Close": pd.Series([137, np.NaN, 142, 144, np.NaN, 145, 144], index = ['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12'])
}

df = pd.DataFrame(d)

# 去除前
print(df)

# 去除后
print(df.dropna(axis=1))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

上面代码中,对 df 使用 dropna(axis=1),对至少包含一个缺失值的列进行去除。

# 2.2 去除全为缺失值的行

# 2.2.1 行的去除

import pandas as pd
import numpy as np

d = {
    "Open": pd.Series([136, 137, 140, 143, np.NaN, 142, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "High": pd.Series([137, 140, np.NaN, 144, np.NaN, 145, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Low": pd.Series([135, 137, 140, np.NaN, np.NaN, 142, 144], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Close": pd.Series([137, np.NaN, 142, 144, np.NaN, 145, 144], index = ['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12'])
}

df = pd.DataFrame(d)

# 去除前
print(df)

# 去除后
print(df.dropna(how='all'))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

上面代码中,对 df 使用 dropna(how='all'),对全为缺失值的行进行去除。

# 2.2.2 列的去除

import pandas as pd
import numpy as np

d = {
    "Open": pd.Series([136, 137, 140, 143, 143, 142, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "High": pd.Series([np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Low": pd.Series([135, 137, 140, np.NaN, np.NaN, 142, 144], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Close": pd.Series([137, np.NaN, 142, 144, np.NaN, 145, 144], index = ['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12'])
}

df = pd.DataFrame(d)

# 去除前
print(df)

# 去除后
print(df.dropna(axis=1, how='all'))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

上面代码中,对 df 使用 dropna(axis=1, how='all'),对全为缺失值的列进行去除。

# 2.3 通过 thresh 设置条件

# 2.3.1 行的去除

除了上面的两种去除方式外,我们还可以设置参数 thresh,此参数表示当一行中包含的非缺失值的个数大于或等于 thresh 的值时,不去除此行。例如:

import pandas as pd
import numpy as np

d = {
    "Open": pd.Series([136, 137, 140, 143, np.NaN, 142, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "High": pd.Series([137, np.NaN, np.NaN, 144, np.NaN, 145, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Low": pd.Series([135, 137, 140, np.NaN, np.NaN, 142, 144], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Close": pd.Series([137, np.NaN, 142, 144, np.NaN, 145, 144], index = ['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12'])
}

df = pd.DataFrame(d)

# 去除前
print(df)

# 去除后
print(df.dropna(thresh=3))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

上面代码中,我们设置 thresh = 3,表示当一行中包含的非缺失值的个数大于或等于 3 时,不去除此行,否则去除此行。

# 2.3.2 列的去除

import pandas as pd
import numpy as np

d = {
    "Open": pd.Series([136, 137, 140, 143, 143, 142, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "High": pd.Series([np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, 145, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Low": pd.Series([135, 137, 140, np.NaN, np.NaN, 142, 144], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Close": pd.Series([137, np.NaN, 142, 144, np.NaN, 145, 144], index = ['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12'])
}

df = pd.DataFrame(d)

# 去除前
print(df)

# 去除后
print(df.dropna(axis=1, thresh=3))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

上面代码中,我们设置 axis=1, thresh=3,表示当一列中包含的非缺失值的个数大于或等于 3 时,不去除此列,否则去除此列。

# 2.4 inplace 参数

上面不管是对行还是对列的去除,都会生成一个新的对象,如果需要在原对象上进行修改,需要设置 inplace 参数。例如: 当不设置参数时:

import pandas as pd
import numpy as np

d = {
    "Open": pd.Series([136, 137, 140, 143, np.NaN, 142, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "High": pd.Series([137, 140, np.NaN, 144, np.NaN, 145, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Low": pd.Series([135, 137, 140, np.NaN, 140, 142, 144], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Close": pd.Series([137, np.NaN, 142, 144, 143, 145, 144], index = ['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12'])
}

df = pd.DataFrame(d)

# 去除前
print(df)

# 去除后
print(df.dropna())

# 去除后的df
print(df)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

从上面的代码输出可以看出,在不加 inplace 参数时,原对象不发生改变。要想原对象发生改变,需要设置参数 inplace。例如:

import pandas as pd
import numpy as np

d = {
    "Open": pd.Series([136, 137, 140, 143, np.NaN, 142, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "High": pd.Series([137, 140, np.NaN, 144, np.NaN, 145, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Low": pd.Series([135, 137, 140, np.NaN, 140, 142, 144], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Close": pd.Series([137, np.NaN, 142, 144, 143, 145, 144], index = ['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12'])
}

df = pd.DataFrame(d)

# 去除前
print(df)

df.dropna(inplace=True)

# 去除后的df
print(df)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

添加参数 inplace=True 后,去除操作是在原对象上进行的。

# 3.填充缺失数据

除了上面对包含缺失值的行或列进行删除外,我们还可以使用函数 fillna()、replace() 对缺失值进行填充。

# 3.1 fillna()

import pandas as pd
import numpy as np

d = {
    "Open": pd.Series([136, 137, 140, 143, 143, 142, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "High": pd.Series([np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, 145, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Low": pd.Series([135, 137, 140, np.NaN, np.NaN, 142, 144], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Close": pd.Series([137, np.NaN, 142, 144, np.NaN, 145, 144], index = ['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12'])
}

df = pd.DataFrame(d)

print(df)

print(df.fillna(0))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

上面代码中,fillna() 函数的参数为 0,表示将 df 中的缺失值替换为 0。fillna() 还可以传入 method 参数,表示填充的方法。例如:

import pandas as pd
import numpy as np

d = {
    "Open": pd.Series([136, 137, 140, 143, 143, 142, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "High": pd.Series([np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, 145, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Low": pd.Series([135, 137, 140, np.NaN, np.NaN, 142, 144], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Close": pd.Series([137, np.NaN, 142, 144, np.NaN, 145, 144], index = ['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12'])
}

df = pd.DataFrame(d)

print(df)

print(df.fillna(method='ffill'))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

参数 method='ffill' 表示在列的方向上用前面的非空值填充后面的缺失值。如果想在行的方向上用前面的非空值填充后面的缺失值,可以增加参数 axis=1。例如:

import pandas as pd
import numpy as np

d = {
    "Open": pd.Series([136, 137, 140, 143, 143, 142, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "High": pd.Series([np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, 145, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Low": pd.Series([135, 137, 140, np.NaN, np.NaN, 142, 144], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Close": pd.Series([137, np.NaN, 142, 144, np.NaN, 145, 144], index = ['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12'])
}

df = pd.DataFrame(d)

print(df)

print(df.fillna(method='ffill', axis=1))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

参数 ffill 表示用前面的值填充后面的值,我们还可以用后面的值填充前面的值。例如:

import pandas as pd
import numpy as np

d = {
    "Open": pd.Series([136, 137, 140, 143, 143, 142, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "High": pd.Series([np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, 145, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Low": pd.Series([135, 137, 140, np.NaN, np.NaN, 142, 144], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Close": pd.Series([137, np.NaN, 142, 144, np.NaN, 145, 144], index = ['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12'])
}

df = pd.DataFrame(d)

print(df)

print(df.fillna(method='bfill'))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

参数 method=‘bfill' 表示在列的方向上用后面的非空值填充前面的缺失值。如果想在行的方向上用后面的非空值填充前面的缺失值,可以增加参数 axis=1。

import pandas as pd
import numpy as np

d = {
    "Open": pd.Series([136, 137, 140, 143, 143, 142, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "High": pd.Series([np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, 145, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Low": pd.Series([135, 137, 140, np.NaN, np.NaN, 142, 144], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Close": pd.Series([137, np.NaN, 142, 144, np.NaN, 145, 144], index = ['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12'])
}

df = pd.DataFrame(d)

print(df)

print(df.fillna(method='bfill', axis=1))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

上面的例子中,在进行填充时,会进行连续的填充。如果我们不想进行连续的填充,可以通过参数限制填充的次数。例如:

import pandas as pd
import numpy as np

d = {
    "Open": pd.Series([136, 137, 140, 143, 143, 142, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "High": pd.Series([np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, 145, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Low": pd.Series([135, 137, 140, np.NaN, np.NaN, 142, 144], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Close": pd.Series([137, np.NaN, 142, 144, np.NaN, 145, 144], index = ['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12'])
}

df = pd.DataFrame(d)

print(df)

print(df.fillna(method='ffill', limit=1))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

上面代码的输出结果中,在 Low 这一列进行填充时,只填充一个缺失值。在行的方向上进行填充也是类似的,例如:

import pandas as pd
import numpy as np

d = {
    "Open": pd.Series([136, 137, 140, 143, 143, 142, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "High": pd.Series([np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, 145, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Low": pd.Series([135, 137, 140, np.NaN, np.NaN, 142, 144], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Close": pd.Series([137, np.NaN, 142, 144, np.NaN, 145, 144], index = ['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12'])
}

df = pd.DataFrame(d)

print(df)

print(df.fillna(method='ffill', limit=1, axis=1))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

上面代码的输出结果中,在 2021-07-07、2021-07-08 这两行进行填充时,只填充一个缺失值。上面讲述了 fillna() 方法的使用,下面来讲下 replace() 方法的使用。

# 3.2 replace()

import pandas as pd
import numpy as np

d = {
    "Open": pd.Series([136, 137, 140, 143, 143, 142, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "High": pd.Series([np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, 145, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Low": pd.Series([135, 137, 140, np.NaN, np.NaN, 142, 144], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Close": pd.Series([137, np.NaN, 142, 144, np.NaN, 145, 144], index = ['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12'])
}

df = pd.DataFrame(d)

print(df)

print(df.replace(np.NaN, 140))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

上述代码将 df 对象中所有的 np.NaN 替换为 140。和 fillna() 一样,replace() 不会在原对象上进行替换,如果想在原对象上进行替换,需要设置参数 inplace=True。例如:

import pandas as pd
import numpy as np

d = {
    "Open": pd.Series([136, 137, 140, 143, 143, 142, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "High": pd.Series([np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, 145, 146], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Low": pd.Series([135, 137, 140, np.NaN, np.NaN, 142, 144], index=['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12']),
    "Close": pd.Series([137, np.NaN, 142, 144, np.NaN, 145, 144], index = ['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07', '2021-07-08', '2021-07-09', '2021-07-12'])
}

df = pd.DataFrame(d)

print(df)

df.replace(np.NaN, 140, inplace=True)

print(df)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 4.总结

本节课我们讲述了缺失值的处理。 image.png

# 5.练习题

创建一个包含缺失值的 DataFrame,并使用 fillna 方法对缺失值进行填充。

更新于: 12/30/2021, 2:39:56 AM