Pandas使用這些函數處理缺失值:python
- isnull和notnull:檢測是不是空值,可用於df和series
- dropna:丟棄、刪除缺失值
- axis : 刪除行仍是列,{0 or ‘index’, 1 or ‘columns’}, default 0
- how : 若是等於any則任何值爲空都刪除,若是等於all則全部值都爲空才刪除
- inplace : 若是爲True則修改當前df,不然返回新的df
- fillna:填充空值
- value:用於填充的值,能夠是單個值,或者字典(key是列名,value是值)
- method : 等於ffill使用前一個不爲空的值填充forword fill;等於bfill使用後一個不爲空的值填充backword fill
- axis : 按行仍是列填充,{0 or ‘index’, 1 or ‘columns’}
- inplace : 若是爲True則修改當前df,不然返回新的df
import pandas as pd
實例:特殊Excel的讀取、清洗、處理
步驟1:讀取excel的時候,忽略前幾個空行
studf = pd.read_excel("./datas/student_excel/student_excel.xlsx", skiprows=2)
studf
|
Unnamed: 0 |
姓名 |
科目 |
分數 |
0 |
NaN |
小明 |
語文 |
85.0 |
1 |
NaN |
NaN |
數學 |
80.0 |
2 |
NaN |
NaN |
英語 |
90.0 |
3 |
NaN |
NaN |
NaN |
NaN |
4 |
NaN |
小王 |
語文 |
85.0 |
5 |
NaN |
NaN |
數學 |
NaN |
6 |
NaN |
NaN |
英語 |
90.0 |
7 |
NaN |
NaN |
NaN |
NaN |
8 |
NaN |
小剛 |
語文 |
85.0 |
9 |
NaN |
NaN |
數學 |
80.0 |
10 |
NaN |
NaN |
英語 |
90.0 |
步驟2:檢測空值
studf.isnull()
|
Unnamed: 0 |
姓名 |
科目 |
分數 |
0 |
True |
False |
False |
False |
1 |
True |
True |
False |
False |
2 |
True |
True |
False |
False |
3 |
True |
True |
True |
True |
4 |
True |
False |
False |
False |
5 |
True |
True |
False |
True |
6 |
True |
True |
False |
False |
7 |
True |
True |
True |
True |
8 |
True |
False |
False |
False |
9 |
True |
True |
False |
False |
10 |
True |
True |
False |
False |
studf["分數"].isnull()
0 False
1 False
2 False
3 True
4 False
5 True
6 False
7 True
8 False
9 False
10 False
Name: 分數, dtype: bool
studf["分數"].notnull()
0 True
1 True
2 True
3 False
4 True
5 False
6 True
7 False
8 True
9 True
10 True
Name: 分數, dtype: bool
# 篩選沒有空分數的全部行
studf.loc[studf["分數"].notnull(), :]
|
Unnamed: 0 |
姓名 |
科目 |
分數 |
0 |
NaN |
小明 |
語文 |
85.0 |
1 |
NaN |
NaN |
數學 |
80.0 |
2 |
NaN |
NaN |
英語 |
90.0 |
4 |
NaN |
小王 |
語文 |
85.0 |
6 |
NaN |
NaN |
英語 |
90.0 |
8 |
NaN |
小剛 |
語文 |
85.0 |
9 |
NaN |
NaN |
數學 |
80.0 |
10 |
NaN |
NaN |
英語 |
90.0 |
步驟3:刪除掉全是空值的列
studf.dropna(axis="columns", how='all', inplace=True)
studf
|
姓名 |
科目 |
分數 |
0 |
小明 |
語文 |
85.0 |
1 |
NaN |
數學 |
80.0 |
2 |
NaN |
英語 |
90.0 |
3 |
NaN |
NaN |
NaN |
4 |
小王 |
語文 |
85.0 |
5 |
NaN |
數學 |
NaN |
6 |
NaN |
英語 |
90.0 |
7 |
NaN |
NaN |
NaN |
8 |
小剛 |
語文 |
85.0 |
9 |
NaN |
數學 |
80.0 |
10 |
NaN |
英語 |
90.0 |
步驟4:刪除掉全是空值的行
studf.dropna(axis="index", how='all', inplace=True)
studf
|
姓名 |
科目 |
分數 |
0 |
小明 |
語文 |
85.0 |
1 |
NaN |
數學 |
80.0 |
2 |
NaN |
英語 |
90.0 |
4 |
小王 |
語文 |
85.0 |
5 |
NaN |
數學 |
NaN |
6 |
NaN |
英語 |
90.0 |
8 |
小剛 |
語文 |
85.0 |
9 |
NaN |
數學 |
80.0 |
10 |
NaN |
英語 |
90.0 |
步驟5:將分數列爲空的填充爲0分
studf.fillna({"分數":0})
|
姓名 |
科目 |
分數 |
0 |
小明 |
語文 |
85.0 |
1 |
NaN |
數學 |
80.0 |
2 |
NaN |
英語 |
90.0 |
4 |
小王 |
語文 |
85.0 |
5 |
NaN |
數學 |
0.0 |
6 |
NaN |
英語 |
90.0 |
8 |
小剛 |
語文 |
85.0 |
9 |
NaN |
數學 |
80.0 |
10 |
NaN |
英語 |
90.0 |
# 等同於
studf.loc[:, '分數'] = studf['分數'].fillna(0)
studf
|
姓名 |
科目 |
分數 |
0 |
小明 |
語文 |
85.0 |
1 |
NaN |
數學 |
80.0 |
2 |
NaN |
英語 |
90.0 |
4 |
小王 |
語文 |
85.0 |
5 |
NaN |
數學 |
0.0 |
6 |
NaN |
英語 |
90.0 |
8 |
小剛 |
語文 |
85.0 |
9 |
NaN |
數學 |
80.0 |
10 |
NaN |
英語 |
90.0 |
步驟6:將姓名的缺失值填充
使用前面的有效值填充,用ffill:forward fill函數
studf.loc[:, '姓名'] = studf['姓名'].fillna(method="ffill")
studf
|
姓名 |
科目 |
分數 |
0 |
小明 |
語文 |
85.0 |
1 |
小明 |
數學 |
80.0 |
2 |
小明 |
英語 |
90.0 |
4 |
小王 |
語文 |
85.0 |
5 |
小王 |
數學 |
0.0 |
6 |
小王 |
英語 |
90.0 |
8 |
小剛 |
語文 |
85.0 |
9 |
小剛 |
數學 |
80.0 |
10 |
小剛 |
英語 |
90.0 |
步驟7:將清洗好的excel保存
studf.to_excel("./datas/student_excel/student_excel_clean.xlsx", index=False)