數據清洗指南

2021-03-02 我想處理數據


在進行回歸建模之前,我們通常需要清洗數據。

下面是數據清洗的定義

數據清洗:從記錄集、表或資料庫中檢測和修正(或刪除)受損或不準確記錄的過程。它識別出數據中不完善、不準確或不相關的部分,並替換、修改或刪除這些髒亂的數據。

本文還是以合併完成後的CEIC數據作為例子,進行講解。

import pandas as pd 
import seaborn as sns
import numpy as np

from IPython.core.interactiveshell import InteractiveShell  
InteractiveShell.ast_node_interactivity = "all"    #這兩行代碼用來使執行單元輸出所有運行結果。

df = pd.read_excel(r"D:\Pythonwork\CEIC\CEIC待處理數據.xlsx")
df.head()

df = df[df.year.between(2003,2018)]

統計年鑑從2003年開始記錄SO2排放量數據,含有SO2排放量的數據,一般是從2003年開始的。所以選擇year在2003年以後的。

對一列數據來說,如果某個城市在時間上的數據缺失超過70%,那麼他就沒有被插值的必要。

df = df.set_index(["year","provs","citys"])

time_span = df.index.to_frame()["year"].unique().max() - df.index.to_frame()["year"].unique().min() +1
# 2003-2018年,一共16年數據
time_span

city_nulltime_less70_col = ((df.isnull().groupby("citys").sum() / time_span * 100)  < 70)  .sum(axis=0) 
# 判斷空缺值,並按照城市分組相加;判斷一城市空缺數據<70%,然後每一列加起來的個數。注意這是好的條件
city_nulltime_less70_col

drop_columns = city_nulltime_less70_col[city_nulltime_less70_col < 260].index  
#如果一列數據,滿足上述條件的城市個數低於260,則刪除
drop_columns

df.drop(columns=drop_columns,inplace=True)

df.tail(20)

上面只是根據不滿足條件的城市個數來去掉變量,但是剩下的變量依然有不滿足條件的城市。如下圖所示。所以刪除這些城市

city_nulltime_less70_row = ((df.isnull().groupby("citys").sum() / time_span * 100)  < 70).sum(axis = 1)
# 判斷空缺值,並按照城市分組相加;判斷一城市空缺數據<70%,然後每一城市加起來的個數。注意這是好的條件
city_nulltime_less70_row

drop_city = city_nulltime_less70_row[city_nulltime_less70_row<50].index
# 有50列以下的數據是好的 所對應的城市,也就是,只要有4列以上的數據是不好的 所對應的城市。
drop_city

df = df.reset_index().set_index("citys").drop(index=drop_city).reset_index()

df_fillna = df.groupby(by = "citys",as_index=False).apply(lambda df: df.interpolate(method = "linear")) #只朝後插值,不朝前
df_fillna = df_fillna.groupby(by = "citys",as_index=False).apply(lambda df: df.interpolate(method = "bfill"))  # 朝前

原來的推文只進行了第一步,而沒有進行前向插值,這裡改正。

這裡插值的方法,假設條件是,單個個體的某一變量,在時間上是連續的,即受該變量的其他時間的影響,沒有結構突變之類的;並且這一變量不受該個體其他變量的影響。這一假設挺符合直覺的,所以這一方法沒有什麼問題。

現在剩下的有空值的城市,其所有時間都是空值。具體原因不再闡述。所以刪除空值

df_fillna_last = df_fillna.dropna(axis=0,how = "any")

下面定位這些城市,進行驗證,發現其所有時間確實都是空值。

df_fillna2 = df_fillna.set_index(["citys","year","provs"])

null = df_fillna2.isnull().sum(axis = 1)
null

null_city = null[null>0].reset_index().citys.unique()
null_city

df_fillna[df_fillna["citys"].isin(null_city)].head(40)

df_fillna3 = df_fillna.set_index("citys")
df_fillna3.drop(index= null_city,inplace=True)


相關焦點

  • 數據清洗&預處理入門完整指南
    數據清洗和預處理是模型訓練之前的必要過程,否則模型可能就「廢」了。本文是一個初學者指南,將帶你領略如何在任意的數據集上,針對任意一個機器學習模型,完成數據預處理工作。數據預處理是建立機器學習模型的第一步(也很可能是最重要的一步),對最終結果有決定性的作用:如果你的數據集沒有完成數據清洗和預處理,那麼你的模型很可能也不會有效——就是這麼簡單。
  • SQL清洗數據
    OLAP 稱之為聯機分析處理,它是對已經存儲在資料庫中的數據進行分析,幫我們得出報表,指導業務。它對數據的實時性要求不高,但數據量往往很大,存儲在資料庫(數據倉庫)中的數據可能還存在數據質量的問題,比如數據重複、數據中有缺失值,或者單位不統一等,因此在進行數據分析之前,首要任務就是對收集的數據進行清洗,從而保證數據質量。
  • 數據清洗神器Pandas
    數據挖掘師們百分之八十的時間都花費在數據清洗上面。小編一入生信隊伍,便成為了數據挖掘一員。老闆,你想讓我對這NG的數據做些什麼?去公共資料庫,找點某癌症的驅動基因出來。結果就是小編不用循環很久了,畢竟:伺服器留你自己用嗎?這麼玩數據,不花你家內存啊?
  • 【數據分析】5大SQL數據清洗方法!
    但真正的原始表是混亂且包含了很多無用的冗餘特徵,所以能夠根據原始數據清洗出相對乾淨的特徵表就很重要。前兩天在Towards Data Science上看到一篇文章,講的是用Pandas做數據清洗,作者將常用的清洗邏輯封裝成了一個個的清洗函數。
  • 知識|數據清洗(data cleaning)的重要性
    但是你要知道「幾行代碼實現XXX」的前提,也就是把一個「髒」數據變成能夠在「幾行代碼」中直接跑出結果的過程可能需要幾十行幾百行代碼進行清洗。俗話說心急吃不了熱豆腐,如果真的希望能夠在數據分析上進一步提高水平,data cleaning是一項基本功並且無論怎樣強調也不為過。數據清洗有很多專著(比如後面提到的Cody's book)[2],不同的軟體也有不同的語法規則,這篇文章並不探討具體的方法,旨在引起大家包括提醒我自己對這項基本功的重視。先了解一下什麼是數據清洗。
  • Pandas數據清洗工具箱
    在下面的代碼片段中,數據清洗代碼被封裝在了一些函數中,代碼的目的十分直觀。你可以直接使用這些代碼,無需將它們嵌入到需要進行少量參數修改的函數中。1.對於數據可視化任務來說,我建議大家保留分類變量,從而讓可視化結果有更明確的解釋,便於理解。4.
  • 5大SQL數據清洗方法!
    但真正的原始表是混亂且包含了很多無用的冗餘特徵,所以能夠根據原始數據清洗出相對乾淨的特徵表就很重要。前兩天在Towards Data Science上看到一篇文章,講的是用Pandas做數據清洗,作者將常用的清洗邏輯封裝成了一個個的清洗函數。
  • 清洗CFPS:兩步搞定中國家庭追蹤調查數據清洗
    數據介紹中國家庭追蹤調查 (China Family Panel Studies,CFPS) 旨在通過跟蹤收集個體、家庭、社區三個層次的數據,反映中國社會、經濟、人口、教育和健康的變遷,為學術研究和公共政策分析提供數據基礎。
  • 福布斯系列之數據清洗(5) | Python數據分析項目實戰
    福布斯系列之數據分析思路篇福布斯系列之數據採集福布斯系列之數據完整性檢查 | Python數據分析項目實戰福布斯系列之補充數據收集 | Python數據分析項目實戰福布斯系列之數據清洗(1) | Python數據分析項目實戰福布斯系列之數據清洗(2) | Python數據分析項目實戰福布斯系列之數據清洗(3) |
  • 8個Python數據清洗代碼,拿來即用
    作者:Admond Lee機器之心編譯不管你承不承認,數據清洗著實不是一件簡單的任務,大多數情況下這項工作是十分耗時而乏味的,但它又是十分重要的。如果你經歷過數據清洗的過程,你就會明白我的意思。而這正是撰寫這篇文章的目的——讓讀者更輕鬆地進行數據清洗工作。事實上,我在不久前意識到,在進行數據清洗時,有一些數據具有相似的模式。也正是從那時起,我開始整理並編譯了一些數據清洗代碼(見下文),我認為這些代碼也適用於其它的常見場景。
  • 我的pandas數據清洗小工具箱
    在用pandas進行數據處理時,同一個操作經常會重複很多次,由於這些常見的場景涉及到不同類型的數據集,因此本文更加側重於展示和解釋這些代碼可以用於完成哪些工作,以便讀者更加方便地使用它們。在下面的代碼片段中,數據清洗代碼被封裝在了一些函數中,代碼的目的十分直觀。
  • #Stata入門:網絡下載數據導入Stata與清洗
    網絡下載數據導入Stata與清洗0 數據介紹之前介紹過氣象數據和空氣品質數據在哈佛網站上的獲取方式,具體詳見如何獲取2020年以來日度氣象數據以及如何免費獲取權威的地級市日度空氣品質數據。今天主要介紹數據下載後,如何導入Stata中,並將數據整理為標準的面板數據。才從之前介紹的網站上卸載後的數據是CSV格式。
  • 【數據科學】R語言dplyr 包進行數據操作與清洗
    在我們數據分析的實際應用中,我們可能會花費大量的時間在數據清洗上,而如果使用 R 裡面自帶的一些函數(base 包的 transform 等),
  • R語言的數據處理與數據清洗:以中國綜合社會調查(cgss)2010數據為例
    來源:博士的計量經濟學乾貨(ID:econometrics_ABC)計量經濟學中我們除了用一些宏觀數據來進行經濟研究外
  • 又來搶大數據飯碗?AWS發布SageMaker:省略數據清洗、建模、調參等步驟
    更多乾貨內容請關注微信公眾號「AI 前線」(ID:ai-front) 據 AI 前線了解,作為全場最大亮點的 SageMaker 平臺,真正做到了「默默秒殺全場」的強大功能:除了免去了開發者進行數據清洗、建模的麻煩事兒,甚至還可以把開發者最頭疼的調參優化交給機器處理。
  • 利用Python進行數據分析之數據清洗
    在進行數據分析和建模的過程中,數據的清洗和準備是後續工作能夠順利開展的保障,包括數據加載
  • Python數據清洗80%的工作量,看這篇就夠了
    數據科學家們會花費大量的時間來清理數據集,毫不誇張地說,數據清洗會佔據他們80%的工作時間,而真正用來分析數據的時間只佔到20%左右。 所以,數據清洗到底是在清洗些什麼? 通常來說,你所獲取到的原始數據不能直接用來分析,因為它們會有各種各樣的問題,如包含無效信息,列名不規範、格式不一致,存在重複值,缺失值,異常值等 本文會給大家介紹如何用Python中自帶的Pandas和NumPy庫進行數據清洗。
  • Excel或Power BI中, 你不能不知道的數據清洗規範利器 !
    Excel或Power BI中,你不能不知道的數據清洗規範利器 !這是一個數據驅動運營、數據決定對策、數據改變未來的時代。無論是海量資料庫,還是一張簡單的表格,都能進一步挖掘數據價值、活用數據。在眾多數據分析工具中,Excel 是最常用,也是最容易上手的分析工具。
  • 使用Pandas&NumPy進行數據清洗的6大常用方法
    (點擊上方藍色,輕鬆關注)數據科學家花了大量的時間清洗數據集,並將這些數據轉換為他們可以處理的格式。事實上,很多數據科學家聲稱開始獲取和清洗數據的工作量要佔整個工作的80%。因此,如果你正巧也在這個領域中,或者計劃進入這個領域,那麼處理這些雜亂不規則數據是非常重要的,這些雜亂數據包括一些缺失值,不連續格式,錯誤記錄,或者是沒有意義的異常值。
  • 【工具篇】41 款實用工具,數據獲取、清洗、建模、可視化都有了
    在其他工具中,數據清洗工具、數據管理和建模工具以及數據可視化工具都非常重要。本文列出了不同類別中的一些主要工具。數據清洗工具一旦完成數據收集,便需要檢查其清潔度。數據清洗通常稱為數據淨化,即其數據從源中刪除或更正髒數據的過程。數據聲明程序的目標是識別和消除數據中的錯誤,為進一步分析、建模和可視化提供一致的數據。在數據項層級上,一些不正確的數據通過適當的驗證被拒絕。在諸如文件和資料庫的同構數據集合中,不一致程度和錯誤數量較少。