Pandas 資料清洗之處理空值
阿新 • • 發佈:2022-05-23
本文參考自菜鳥教程。
資料清洗是對一些沒有用的資料進行處理的過程。
即處理資料集中資料缺失、資料格式錯誤、錯誤資料或重複資料的情況。
import pandas as pd
df = pd.read_csv('./property-data.csv')
print(df.to_string())
print(df.info())
清洗空值
檢查空值----isnull()
通過 Series.isnull() 判斷各個單元格是否為空。
本質上 DataFrame 返回的行或者列都是 Series 型別的資料。
# 首先設定 空 的"定義" missing_values = ['NA', 'n/a', '--', ''] # 根據 CSV 檔案尋找其中 空 的形式 df = pd.read_csv('property-data.csv', na_values=missing_values) # 重新讀取 csv 檔案,並設定空值
# 檢視第一行有沒有空值
print(df.loc[2])
print('********************************')
print(df.loc[2].isnull())
PID 100003000.0 ST_NUM NaN ST_NAME LEXINGTON OWN_OCCUPIED N NUM_BEDROOMS NaN NUM_BATH 1 SQ_FT 850.0 Name: 2, dtype: object ******************************** PID False ST_NUM True ST_NAME False OWN_OCCUPIED False NUM_BEDROOMS True NUM_BATH False SQ_FT False Name: 2, dtype: bool
# 檢視第二列有沒有空值
print(df.ST_NUM)
print('********************************')
print(df.ST_NUM.isnull())
0 104.0 1 197.0 2 NaN 3 201.0 4 203.0 5 207.0 6 NaN 7 213.0 8 215.0 Name: ST_NUM, dtype: float64 ******************************** 0 False 1 False 2 True 3 False 4 False 5 False 6 True 7 False 8 False Name: ST_NUM, dtype: bool
刪除空值所在的行----dropna()
dropna()方法:DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
引數說明:
axis:預設為 0,表示逢空值剔除整行,如果設定引數 axis=1 表示逢空值去掉整列。
how:預設為 'any' 如果一行(或一列)裡任何一個數據有出現 NA 就去掉整行,
如果設定 how='all' 一行(或列)都是 NA 才去掉這整行。
thresh:設定需要多少非空值的資料才可以保留下來的。
subset:設定想要檢查的列。如果是多個列,可以使用列名的 list 作為引數。
inplace:如果設定 True,將計算得到的值直接覆蓋之前的值並返回 None,修改的是源資料。
print(df.to_string())
PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 100001000.0 104.0 PUTNAM Y 3 1 1000.0
1 100002000.0 197.0 LEXINGTON N 3 1.5 NaN
2 100003000.0 NaN LEXINGTON N NaN 1 850.0
3 100004000.0 201.0 BERKELEY 12 1 NaN 700.0
4 NaN 203.0 BERKELEY Y 3 2 1600.0
5 100006000.0 207.0 BERKELEY Y NaN 1 800.0
6 100007000.0 NaN WASHINGTON NaN 2 HURLEY 950.0
7 100008000.0 213.0 TREMONT Y 1 1 NaN
8 100009000.0 215.0 TREMONT Y na 2 1800.0
dfTemp = df.dropna(axis=0, how='any', subset=['PID', 'ST_NUM'], inplace=False)
# 檢查df中 subset 中的列
# 一旦遇到空值 (how='any')
# 就刪除此行 (axis=0)
# 不修改源資料 (inplace=False)
print(dfTemp.to_string())
PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 100001000.0 104.0 PUTNAM Y 3 1 1000.0
1 100002000.0 197.0 LEXINGTON N 3 1.5 NaN
3 100004000.0 201.0 BERKELEY 12 1 NaN 700.0
5 100006000.0 207.0 BERKELEY Y NaN 1 800.0
7 100008000.0 213.0 TREMONT Y 1 1 NaN
8 100009000.0 215.0 TREMONT Y na 2 1800.0
替換空值單元格----fillna()
一般指定某一列,當此列中出現空值時,使用此列的均值mean()
、中位數medium()
或眾數mode()
來替代空值單元格。
print(df.to_string())
PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 100001000.0 104.0 PUTNAM Y 3 1 1000.0
1 100002000.0 197.0 LEXINGTON N 3 1.5 NaN
2 100003000.0 NaN LEXINGTON N NaN 1 850.0
3 100004000.0 201.0 BERKELEY 12 1 NaN 700.0
4 NaN 203.0 BERKELEY Y 3 2 1600.0
5 100006000.0 207.0 BERKELEY Y NaN 1 800.0
6 100007000.0 NaN WASHINGTON NaN 2 HURLEY 950.0
7 100008000.0 213.0 TREMONT Y 1 1 NaN
8 100009000.0 215.0 TREMONT Y na 2 1800.0
# 對 ST_NUM 列的空值,使用此列的均值替換,並修改源資料df
df.ST_NUM.fillna(df.ST_NUM.mean(), inplace=True)
print(df)
PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH \
0 100001000.0 104.000000 PUTNAM Y 3 1
1 100002000.0 197.000000 LEXINGTON N 3 1.5
2 100003000.0 191.428571 LEXINGTON N NaN 1
3 100004000.0 201.000000 BERKELEY 12 1 NaN
4 NaN 203.000000 BERKELEY Y 3 2
5 100006000.0 207.000000 BERKELEY Y NaN 1
6 100007000.0 191.428571 WASHINGTON NaN 2 HURLEY
7 100008000.0 213.000000 TREMONT Y 1 1
8 100009000.0 215.000000 TREMONT Y na 2
SQ_FT
0 1000.0
1 NaN
2 850.0
3 700.0
4 1600.0
5 800.0
6 950.0
7 NaN
8 1800.0