1.过滤缺失值(dropna()
):
- Series数据
在Series上使用dropna()
方法,返回数据中所有的非空数据及其索引值。
import pandas as pd
import numpy as np
s = pd.Series([1,np.nan,3,np.nan,5])
s_1 = s.dropna()
s_2 = s[s.notnull()]
print(s_1)
print(s_2)
使用dropna()
和使用布尔型数据过滤操作的结果是等价的。
0 1.0
2 3.0
4 5.0
dtype: float64
0 1.0
2 3.0
4 5.0
dtype: float64
- DataFrame数据
在DataFrame数据中dropna()
方法默认删除所有包含缺失值的行,要删除列的话就需要指定轴axis=1
。
df = pd.DataFrame([[1,5,9],[2,np.nan,np.nan],[np.nan,np.nan,np.nan],[np.nan,8,2]])
cleaned_df = df.dropna()
print(df)
print(cleaned_df)
0 1 2
0 1.0 5.0 9.0
1 2.0 NaN NaN
2 NaN NaN NaN
3 NaN 8.0 2.0
0 1 2
0 1.0 5.0 9.0
当传入how=’all’时,只删除所有值均为NaN的行,相应的可以删除所有值均为NaN的列。
df = pd.DataFrame([[1,5,9],[2,np.nan,np.nan],[np.nan,np.nan,np.nan],[np.nan,8,2]])
cleaned_df = df.dropna(how='all')
print(df)
print(cleaned_df)
另外使用thresh
参数(thresh为非NaN值的最少个数)可以保留包含一定数量的观察值的行。
df = pd.DataFrame(np.random.randn(7,3))
df.iloc[:4,1] = np.nan
df.iloc[:2,2] = np.nan
print(df)
df_1 = df.dropna()
print(df_1)
df_2 = df.dropna(thresh=2)
print(df_2)
0 1 2
0 0.104579 NaN NaN
1 0.471204 NaN NaN
2 -0.307848 NaN 0.415358
3 0.002692 NaN 0.191897
4 -0.769257 1.545613 -0.359715
5 -0.480084 -1.421668 1.241730
6 0.306479 2.317817 0.152930
0 1 2
4 -0.769257 1.545613 -0.359715
5 -0.480084 -1.421668 1.241730
6 0.306479 2.317817 0.152930
0 1 2
2 -0.307848 NaN 0.415358
3 0.002692 NaN 0.191897
4 -0.769257 1.545613 -0.359715
5 -0.480084 -1.421668 1.241730
6 0.306479 2.317817 0.152930
2.补全缺失值:
有时候因为数据量较少,在处理缺失值的时候需要进行补全操作,而不是过滤掉缺失值。
这时就需要使用fillna()
方法。
- 该方法可以使用指定的数据填充缺失值。
df = pd.DataFrame(np.random.randn(7,3))
df.iloc[:4,1] = np.nan
df.iloc[:2,2] = np.nan
print(df)
# 使用常数进行填充
df_1 = df.fillna(0)
print(df_1)
# 使用字典,为不同列设定不同的填充值
df_2 = df.fillna({1:0.5,2:-0.5})
print(df_2)
0 1 2
0 0.092177 NaN NaN
1 1.193407 NaN NaN
2 0.106837 NaN 0.596378
3 -0.627817 NaN 1.177290
4 0.166239 -0.408888 -0.181446
5 1.610396 -0.456940 1.538528
6 -0.468380 -0.780443 -0.777990
0 1 2
0 0.092177 0.000000 0.000000
1 1.193407 0.000000 0.000000
2 0.106837 0.000000 0.596378
3 -0.627817 0.000000 1.177290
4 0.166239 -0.408888 -0.181446
5 1.610396 -0.456940 1.538528
6 -0.468380 -0.780443 -0.777990
0 1 2
0 0.092177 0.500000 -0.500000
1 1.193407 0.500000 -0.500000
2 0.106837 0.500000 0.596378
3 -0.627817 0.500000 1.177290
4 0.166239 -0.408888 -0.181446
5 1.610396 -0.456940 1.538528
6 -0.468380 -0.780443 -0.777990
- 用于重建索引的插值方法与可适用于
fillna()
方法。
df = pd.DataFrame(np.random.randn(7,3))
df.iloc[:4,1] = np.nan
df.iloc[:2,2] = np.nan
print(df)
df_1 = df.fillna(method='bfill')
print(df_1)
df_2 = df.fillna(method='bfill',limit=2)
print(df_2)
0 1 2
0 2.148943 NaN NaN
1 0.576778 NaN NaN
2 -0.908773 NaN 0.224338
3 0.918394 NaN 0.636614
4 -0.578907 0.798676 0.087646
5 -1.627371 -0.095700 -1.589937
6 0.673293 0.632896 1.334857
0 1 2
0 2.148943 0.798676 0.224338
1 0.576778 0.798676 0.224338
2 -0.908773 0.798676 0.224338
3 0.918394 0.798676 0.636614
4 -0.578907 0.798676 0.087646
5 -1.627371 -0.095700 -1.589937
6 0.673293 0.632896 1.334857
0 1 2
0 2.148943 NaN 0.224338
1 0.576778 NaN 0.224338
2 -0.908773 0.798676 0.224338
3 0.918394 0.798676 0.636614
4 -0.578907 0.798676 0.087646
5 -1.627371 -0.095700 -1.589937
6 0.673293 0.632896 1.334857
- 日常数据分析中,一般会采用使用数据的平均值或中位数来填充缺失值。
df = pd.DataFrame(np.random.randn(7,3))
df.iloc[:4,1] = np.nan
df.iloc[:2,2] = np.nan
print(df)
df_1 = df.fillna({1:df[1].mean(),2:df[2].mean()})
print(df_1)
0 1 2
0 -2.093230 NaN NaN
1 0.566725 NaN NaN
2 -0.286275 NaN -1.139939
3 -2.025216 NaN 1.152511
4 -0.231813 1.850652 0.589352
5 -0.448737 0.416588 -0.683374
6 0.265692 -0.085756 -0.451983
0 1 2
0 -2.093230 0.727161 -0.106686
1 0.566725 0.727161 -0.106686
2 -0.286275 0.727161 -1.139939
3 -2.025216 0.727161 1.152511
4 -0.231813 1.850652 0.589352
5 -0.448737 0.416588 -0.683374
6 0.265692 -0.085756 -0.451983
fillna()
方法返回的是一个新对象,可以通过inplace=True
修改已经存在的对象。
- fillna()函数参数
参数 | 说明 |
---|---|
value | 用于填充缺失值的变量值或字典型对象 |
method | 插值方法,默认为ffill |
axis | 指定轴 |
inplace | 修改被调用的对象,而不是生成一个备份 |
limit | 用于向前或向后填充时最大的填充范围 |
Reference:
《Python for Data Analysis:Data Wrangling with Pandas,Numpy,and IPython》