一、缺失值的处理
1.常用方法
import numpy as np
import pandas as pd
string_data = pd.Series(['apple','banana',np.nan,'orange'])
print(string_data.dropna())
这样可去除含有NA的一行
0 apple
1 banana
3 orange
dtype: object
string_data = pd.Series(['apple','banana',np.nan,'orange'])
print(string_data.fillna(1))
输出结果会将NA填充为括号内的值
0 apple
1 banana
2 1
3 orange
dtype: object
另外,传入参数method=‘ffill’,可以将NA填充为前一行的值
0 apple
1 banana
2 banana
3 orange
dtype: object
同理,传入method=‘bfill’,将NA填充为后一行的值
0 apple
1 banana
2 orange
3 orange
dtype: object
该方法返回哪些值是缺失值的布尔值
string_data = pd.Series(['apple','banana',np.nan,'orange'])
print(string_data.isnull())
0 False
1 False
2 True
3 False
dtype: bool
与isnull互为反函数
string_data = pd.Series(['apple','banana',np.nan,'orange'])
print(string_data.notnull())
0 True
1 True
2 False
3 True
dtype: bool
2.过滤缺失值
dropna默认情况下会删除包含缺失值的行,当处理DataFrame对象时会比Series复杂一些,因为DataFrame既有行又有列,这种情况可以给dropna传入参数来满足不同的需求。
data = pd.DataFrame(np.arange(16).reshape(4,4))
data.iloc[1,1:] = np.nan
data.iloc[2,:] = np.nan
data.iloc[:,3] = np.nan
data[0][3] = np.nan
print(data)
0 1 2 3
0 0.0 1.0 2.0 NaN
1 4.0 NaN NaN NaN
2 NaN NaN NaN NaN
3 NaN 13.0 14.0 NaN
给dropna传入how=‘all’时,将删除所有值均为NA的行
print(data.dropna(how='all'))
0 1 2 3
0 0.0 1.0 2.0 NaN
1 4.0 NaN NaN NaN
3 NaN 13.0 14.0 NaN
给dropna传入axis=1时,将删除的维度转变为按行删除,即删除列(易搞混)
print(data.dropna(how='all',axis=1))
0 1 2
0 0.0 1.0 2.0
1 4.0 NaN NaN
2 NaN NaN NaN
3 NaN 13.0 14.0
df = pd.DataFrame(np.arange(21).reshape(7,3))
df.iloc[:4,1] = np.nan
df.iloc[:2,2] = np.nan
print(df)
0 1 2
0 0 NaN NaN
1 3 NaN NaN
2 6 NaN 8.0
3 9 NaN 11.0
4 12 13.0 14.0
5 15 16.0 17.0
6 18 19.0 20.0
给dropna传入thresh=2,将输出至少含2个非NA值的行
print(df.dropna(thresh=2))
0 1 2
2 6 NaN 8.0
3 9 NaN 11.0
4 12 13.0 14.0
5 15 16.0 17.0
6 18 19.0 20.0
3.补全缺失值
大多数情况下,主要使用fillna来补全缺失值,下面介绍fillna的参数。
调用fillna时,可以使用一个常数/字符串来替代缺失值
df = pd.DataFrame(np.arange(21).reshape(7,3),dtype=float)
df.iloc[:4,1] = np.nan
df.iloc[:2,2] = np.nan
print(df.fillna(99))
0 1 2
0 0.0 99.0 99.0
1 3.0 99.0 99.0
2 6.0 99.0 8.0
3 9.0 99.0 11.0
4 12.0 13.0 14.0
5 15.0 16.0 17.0
6 18.0 19.0 20.0
调用fillna时使用字典,可以为不同列设定不同的填充值
print(df.fillna({1:22,2:33}))
0 1 2
0 0.0 22.0 33.0
1 3.0 22.0 33.0
2 6.0 22.0 8.0
3 9.0 22.0 11.0
4 12.0 13.0 14.0
5 15.0 16.0 17.0
6 18.0 19.0 20.0
给fillna传入method=‘ffill’或method=‘bfill’,将NA值填充为前一行值或后一行值,如果没有其他参数,默认是‘ffill’
print(df.fillna(method='bfill'))
0 1 2
0 0.0 13.0 8.0
1 3.0 13.0 8.0
2 6.0 13.0 8.0
3 9.0 13.0 11.0
4 12.0 13.0 14.0
5 15.0 16.0 17.0
6 18.0 19.0 20.0
给fillna传入axis=1,将填充方向转变为按列填充,即横向填充(这里极易搞混),若无规定,默认为axis=0
print(df.fillna(method='ffill',axis=1))
0 1 2
0 0.0 0.0 0.0
1 3.0 3.0 3.0
2 6.0 6.0 8.0
3 9.0 9.0 11.0
4 12.0 13.0 14.0
5 15.0 16.0 17.0
6 18.0 19.0 20.0
给fillna传入limit参数用于规定前向或后向填充时的最大的填充范围
print(df.fillna(method='ffill',axis=1,limit=1))
0 1 2
0 0.0 0.0 NaN
1 3.0 3.0 NaN
2 6.0 6.0 8.0
3 9.0 9.0 11.0
4 12.0 13.0 14.0
5 15.0 16.0 17.0
6 18.0 19.0 20.0
_ = df.fillna(22,inplace=True)
print(df)
0 1 2
0 0.0 22.0 22.0
1 3.0 22.0 22.0
2 6.0 22.0 8.0
3 9.0 22.0 11.0
4 12.0 13.0 14.0
5 15.0 16.0 17.0
6 18.0 19.0 20.0