首页Python11.数据清洗与处理——缺...

11.数据清洗与处理——缺失值处理

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》

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments