# 資料清洗注意事項及常用操作 ###### tags:`筆記` ## 提醒:"曹老師的講義在特徵工程部分蠻完整的,可先詳讀後,配合mod05了解實作流程。" 流程: 資料讀取=>格式調整=>處理缺失值=>處理離群值=>特徵縮放=>探索資料 ### 讀檔常用參數 - header: Row number(s) to use as the column names,預設是0 - index_col: 預設是=None,也就是沒有index的欄位 ### 常用來觀察df的func - 看整張df的資料型態等 > df.info() - 看前幾筆資料 > df.head() - 總共有幾筆資料,幾個欄位 > df.shape - 看整張df有什麼欄位 > df.columns > 配合reindex(columns=[]), 可將欄位順序快速調整 ex:原column順序=['a','b','c','d','e','f'] > df = df.reindex(columns=['a','f','d','b','c','e']) 增加欄位的方式,可參考:https://www.delftstack.com/zh-tw/howto/python-pandas/how-to-create-an-empty-column-in-pandas-dataframe/ - 改變column_name ex:將"Address"換成"土地區段位置建物區段門牌" > df = df.rename(columns={"Address":"土地區段位置建物區段門牌"}) - 看整張df的統計數值 > df.describe() - 看每個欄位的dtype > df.dtypes - 看欄位中有那些值 > df["column_name"].unique() 看 透過設定index跟column來觀看資料。(關於iloc用法,官網範例很完整), 一個簡單的sample如下, > df.iloc[[0,10]][["交易年月日","交易標的"]] 交易年月日 交易標的 0 1010629 房地(土地+建物) 10 1010718 車位 iloc內也可接受func。下面例子為取出index為偶數的row > df.iloc[lambda x: x.index % 2 == 0] 參考:https://medium.com/@b89202027_37759/%E5%AF%A6%E7%94%A8%E4%BD%86%E5%B8%B8%E5%BF%98%E8%A8%98%E7%9A%84pandas-dataframe%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A4-1-976f48eb2bd5 ### 轉換型態:建議在一開始拿到資料時就可以先做一次,操作時會減少報錯,縮短除錯時間 有些時候astype()函數執行成功了也並不一定代表著執行結果符合預期,建議寫一個轉換的function先處理欄位的值 參考:https://zhuanlan.zhihu.com/p/35287822 轉換時間型態: 參考:https://ithelp.ithome.com.tw/articles/10235251 ### 去除重複, 及缺失值處理 需要去重複時,可drop_duplicates方法完成: drop_duplicates方法還可以按照某列去重,例如去除id列重複的所有記錄 填入平均數的code > df.score.fillna(sample.score.mean()) 參考: 1. https://www.mdeditor.tw/pl/pmLR/zh-tw 2. https://medium.com/@zector1030/pandas-fillna-%E7%AF%84%E4%BE%8B-5d33819fb7b8 ### 讓提醒文字不要出現: > import warnings > warnings.filterwarnings('ignore') ### 當有drop的行為時,最好配合reset_index(drop=True): reset_index可維持index順序的正確性,不然會缺少被移除列的index。 後面有使用for loop時會錯誤 參數drop=True,讓舊index被移除而不是生成一個新的欄位 ### 而想要讓drop後的新df保留並替代舊的df,方法有二: 一、 可用參數:inplace=True 二、 使用一個變數去接, ex:df = df.drop([0]).rest_index(drop=True) drop欄的時候要記得參數axis=1 ,預設是axis=0 tips:沒有使用的話就只是show出來,但原始的df並不會改變,可以先不使用,確認好處理後是想要的結果再去接,可節省時間 ### 設定觀看欄位中某些值的資料 ex: > df = df[~df["交易標的"].isin(["土地","建物","車位"])] > 這句是表示我要將df改成 欄位[交易標的]的值沒有[土地、車位、建物],`~` 是表示反向, ### 對於df or df[columns]值的操作可參考.apply()的使用 參考:https://zhuanlan.zhihu.com/p/100064394 ex: > import re > > df['交易筆棟數_土地'] = df['交易筆棟數'].apply(lambda x:int(re.findall(r'\d+',x)[0])) 原始資料:欄位[交易筆棟數]的值[土地3建物1車位1],使用以上方式將 此轉換成:欄位[交易筆棟數_土地]值[3],使用了正規表示式, 將數值提取出來 ### 多條件的篩選,並調整篩選後某欄位的值 當我們想做多條件的篩選,並且將此條件下的某欄位的值做調整。提供以下作法給各位參考 ex: [建物型態]是套房或其它,且[總樓層數]在1的物件。將[建物型態]改為透天厝 >con1 = df["建物型態"].isin(["套房(1房1廳1衛)","其他"]) >con2 = df["總樓層數"].isin([1]) >df["建物型態"][con1 & con2] = "透天厝" 參考:https://ithelp.ithome.com.tw/articles/10194003 ### 將欄位中的值做調整 >df["主要建材"].replace(["土木造", "土造", "土磚石混合造", "木造", "加強磚造", "石造", "竹造"], "磚造", inplace = True) ### 將欄位的值取出成list ex: > com_list = df["建築完成年月"].tolist() 如要配合for loop 操作記得要先df.rest_index() tips: list.index(list中的物件),可返回此物件的index ### 將操作後的list再放回insert回df ex: >df.insert(2,"建築年", com_year_list) 參數 1. loc:int Insertion index. Must verify 0 <= loc <= len(columns). 2. column:str, number, or hashable object Label of the inserted column. 3. value:int, Series, or array-like 4. allow_duplicatesbool, optional 如果没有設定allow_duplicates = True,此時如果添加的列已經存在,則會報錯,(我覺得這個使用狀況很少,不然有重覆名也不好去操作) ### 在加入嫌惡特徵的操作,合併報表:concat、join、merge 直接附上我覺得蠻詳細的說明 參考:https://zhuanlan.zhihu.com/p/76476957 將資料夾中的檔案名寫入list,方便後續讀檔作業 > dir_list = os.listdir("./新加入特徵/tempOut/") ### 結束前的檢查 可以寫個func檢查還有沒有空值,以及各欄位值的合理區間檢查(也可讓後續離群值處理),以及型態檢查。 檢查之後再來刪除欄位,可以減少很多再重複比對錯誤資料跟原始資料的不同。 ### 補充參考: 1. pandas實用技巧 https://leemeng.tw/practical-pandas-tutorial-for-aspiring-data-scientists.html 2. pandas實用技巧2 https://medium.com/@b89202027_37759/%E5%AF%A6%E7%94%A8%E4%BD%86%E5%B8%B8%E5%BF%98%E8%A8%98%E7%9A%84pandas-dataframe%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A4-2-aa99d4eb949e 3. pandas實用技巧3 https://www.mdeditor.tw/pl/g2IG/zh-tw 4. numpy入門 https://blog.techbridge.cc/2017/07/28/data-science-101-numpy-tutorial/ 5. DataFrame的新增、迴圈與刪除:https://ithelp.ithome.com.tw/articles/10191774 6. 利用單行迴圈產生list:https://sites.google.com/site/ezpythoncolorcourse/listandsingleforloop 7. 利用groupby串接字串:http://hk.uwenku.com/question/p-mdarcfkf-qc.htm 8. 用Pandas分析資料— 資料的聚合:https://seanyeh.medium.com/%E7%94%A8pandas%E5%88%86%E6%9E%90%E8%B3%87%E6%96%99-%E8%B3%87%E6%96%99%E7%9A%84%E8%81%9A%E5%90%88-e08f1b1504ed 9. 資料前處理( Label encoding、 One hot encoding):https://medium.com/@PatHuang/%E5%88%9D%E5%AD%B8python%E6%89%8B%E8%A8%98-3-%E8%B3%87%E6%96%99%E5%89%8D%E8%99%95%E7%90%86-label-encoding-one-hot-encoding-85c983d63f87