Pandas對缺失值的處理

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)
相關文章
相關標籤/搜索