日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python代码实操:详解数据清洗

發布時間:2025/3/15 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python代码实操:详解数据清洗 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

導讀:此前的文章《一文看懂數據清洗:缺失值、異常值和重復值的處理》中,我們介紹了數據清洗的過程和方法,本文給出各步驟的詳細代碼,方便你動手操作。


作者:宋天龍

如需轉載請聯系大數據(ID:hzdashuju)



本文示例中,主要用了幾個知識點:


  • 通過?pd.DataFrame?新建數據框。
  • 通過 df.iloc[] 來選擇特定的列或對象。
  • 使用Pandas的 isnull() 判斷值是否為空。
  • 使用 all()any() 判斷每列是否包含至少1個為True或全部為True的情況。
  • 使用Pandas的 dropna() 直接刪除缺失值。
  • 使用 sklearn.preprocessing 中的 Imputer 方法對缺失值進行填充和替換,支持3種填充方法。
  • 使用Pandas的 fillna 填充缺失值,支持更多自定義的值和常用預定義方法。
  • 通過 copy() 獲得一個對象副本,常用于原始對象和復制對象同時進行操作的場景。
  • 通過 for 循環遍歷可迭代的列表值。
  • 自定義代碼實現了 Z-Score 計算公式。
  • 通過Pandas的 duplicated() 判斷重復數據記錄。
  • 通過Pandas的 drop_duplicates() 刪除數據記錄,可指定特定列或全部。



01 缺失值處理


在缺失值的處理上,主要配合使用 sklearn.preprocessing 中的Imputer類、Pandas和Numpy。其中由于Pandas對于數據探索、分析和探查的支持較為良好,因此圍繞Pandas的缺失值處理較為常用。


1. 導入庫


該代碼示例中用到Pandas、Numpy和sklearn。


import?pandas?as?pd?????????????? #?導入Pandas庫 import?numpy?as?np?????????????? #?導入Numpy庫 from?sklearn.preprocessing?import?Imputer???? #?導入sklearn.preprocessing中的Imputer庫


2. 生成缺失數據


#?生成缺失數據 df?=?pd.DataFrame(np.random.randn(6,?4),?columns=['col1',?'col2',?'col3',?'col4'])??????????????????   ?#?生成一份數據 df.iloc[1:2,?1]?=?np.nan??????     ?#?增加缺失值 df.iloc[4,?3]?=?np.nan?????????????? #?增加缺失值 print(df)


通過Pandas生成一個6行4列,列名分別為'col1'、'col2'、'col3'、'col4'的數據框。同時,數據框中增加兩個缺失值數據。


除了示例中直接通過pd.DataFrame來直接創建數據框外,還可以使用數據框對象的 df.from_recordsdf.from_dictdf.from_items 來從元組記錄、字典和鍵值對對象創建數據框,或使用 pandas.read_csvpandas.read_tablepandas.read_clipboard 等方法讀取文件或剪貼板創建數據框。該代碼段執行后返回了定義含有缺失值的數據框,結果如下:


???????col1??????col2??????col3??????col4 0?-0.112415?-0.768180?-0.084859??0.296691 1?-1.777315???????NaN?-0.166615?-0.628756 2?-0.629461??1.892790?-1.850006??0.157567 3??0.544860?-1.230804??0.836615?-0.945712 4??0.703394?-0.764552?-1.214379???????NaN 5??1.928313?-1.376593?-1.557721??0.289643


提示:由于生成的數據是隨機產生的,因此讀者的實際結果可能與上述結果不一致。


3. 判斷缺失值


#?查看哪些值缺失 nan_all?=?df.isnull()??????#?獲得所有數據框中的N值 print(nan_all)??????????#?打印輸出 #?查看哪些列缺失 nan_col1?=?df.isnull().any()????#?獲得含有NA的列 nan_col2?=?df.isnull().all()????#?獲得全部為NA的列 print(nan_col1)??????????????#?打印輸出 print(nan_col2)??????????????#?打印輸出


通過 df.null() 方法找到所有數據框中的缺失值(默認缺失值是 NaN 格式),然后使用 any()all() 方法來查找含有至少1個或全部缺失值的列,其中 any() 方法用來返回指定軸中的任何元素為 True,而 all() 方法用來返回指定軸的所有元素都為 True。該代碼段執行后返回如下結果。


判斷元素是否是缺失值(第2行第2列和第5行第4列):


???col1???col2???col3???col4 0??False??False??False??False 1??False???True??False??False 2??False??False??False??False 3??False??False??False??False 4??False??False??False???True 5??False??False??False??False


列出至少有一個元素含有缺失值的列(該示例中為col2和col4):


col1????False col2?????True col3????False col4?????True dtype:?bool


列出全部元素含有缺失值的列(該示例中沒有):


col1????False col2????False col3????False col4????False dtype:?bool


4. 丟棄缺失值


df2?=?df.dropna()??#?直接丟棄含有NA的行記錄 print(df2)??#?打印輸出


通過Pandas默認的 dropna() 方法丟棄缺失值,返回無缺失值的數據記錄。該代碼段執行后返回如下結果(第2行、第5行數據記錄被刪除):


???????col1??????col2??????col3??????col4 0?-0.112415?-0.768180?-0.084859??0.296691 2?-0.629461??1.892790?-1.850006??0.157567 3??0.544860?-1.230804??0.836615?-0.945712 5??1.928313?-1.376593?-1.557721??0.289643


5. 通過sklearn的數據預處理方法對缺失值進行處理


nan_model?=?Imputer(missing_values='NaN',?strategy='mean',?axis=0)??#?建立替換規則:將值為NaN的缺失值以均值做替換 nan_result?=?nan_model.fit_transform(df)??#?應用模型規則 print(nan_result)??#?打印輸出


首先通過 Imputer 方法創建一個預處理對象,其中 missing_values 為默認缺失值的字符串,默認為 NaN;示例中選擇缺失值替換方法是均值(默認),還可以選擇使用中位數和眾數進行替換,即 strategy 值設置為 medianmost_frequent;后面的參數 axis 用來設置輸入的軸,默認值為0,即使用列做計算邏輯。


然后使用預處理對象的 fit_transform 方法對 df(數據框對象)進行處理,該方法是將 fittransform 組合起來使用。代碼執行后返回如下結果:


[[-0.11241503?-0.76818022?-0.08485904??0.29669147][-1.77731513?-0.44946793?-0.16661458?-0.62875601][-0.62946127??1.89278959?-1.85000643??0.15756702][?0.54486026?-1.23080434??0.836615???-0.9457117?][?0.70339369?-0.76455205?-1.21437918?-0.16611331][?1.92831315?-1.37659263?-1.55772092??0.28964265]]


代碼中的第2行第2列和第5行第4列分別被各自列的均值替換。為了驗證,我們手動計算一下各自列的均值,通過使用 df['col2'].mean()df['col4'].mean() 分別獲得這兩列的均值為-0.4494679289032068和-0.16611331259664791,與sklearn返回的結果一致。


6. 使用Pandas做缺失值處理


nan_result_pd1?=?df.fillna(method='backfill')??????????#?用后面的值替換缺失值 nan_result_pd2?=?df.fillna(method='bfill',?limit=1)??????#?用后面的值替代缺失值,限制每列只能替代一個缺失值 nan_result_pd3?=?df.fillna(method='pad')??????????#?用前面的值替換缺失值 nan_result_pd4?=?df.fillna(0)??????????????????#?用0替換缺失值 nan_result_pd5?=?df.fillna({'col2':?1.1,?'col4':?1.2})????#?用不同值替換不同列的缺失值 nan_result_pd6?=?df.fillna(df.mean()['col2':'col4'])????#?用各自列的平均數替換缺失值 #?打印輸出 print(nan_result_pd1)??????????????????????#?打印輸出 print(nan_result_pd2)??????????????????????#?打印輸出 print(nan_result_pd3)??????????????????????#?打印輸出 print(nan_result_pd4)??????????????????????#?打印輸出 print(nan_result_pd5)?????????????????????#?打印輸出 print(nan_result_pd6)??????????????????????#?打印輸出


Pandas對缺失值的處理方法是 df.fillna(),該方法中最主要的兩個參數是 valuemethod。前者通過固定(或手動指定)的值替換缺失值,后者使用Pandas提供的默認方法替換缺失值。以下是 method 支持的方法。


  • padffill:使用前面的值替換缺失值,示例中 nan_result_pd3 使用了 pad 方法。
  • backfillbfill:使用后面的值替換缺失值,示例中 nan_result_pd1 和?nan_result_pd2 使用了該方法。
  • None:無。


在示例中, nan_result_pd4nan_result_pd5nan_result_pd6 分別使用0、不同的值、平均數替換缺失值。需要注意的是,如果要使用不同具體值替換,需要使用 scalardictSeriesDataFrame 的格式定義。


上述代碼執行后返回如下結果。


用后面的值(method='backfill')替換缺失值:


???????col1??????col2??????col3??????col4 0?-0.112415?-0.768180?-0.084859??0.296691 1?-1.777315??1.892790?-0.166615?-0.628756 2?-0.629461??1.892790?-1.850006??0.157567 3??0.544860?-1.230804??0.836615?-0.945712 4??0.703394?-0.764552?-1.214379??0.289643 5??1.928313?-1.376593?-1.557721??0.289643


用后面的值(method='bfill', limit = 1)替換缺失值:


???????col1??????col2??????col3??????col4 0?-0.112415?-0.768180?-0.084859??0.296691 1?-1.777315??1.892790?-0.166615?-0.628756 2?-0.629461??1.892790?-1.850006??0.157567 3??0.544860?-1.230804??0.836615?-0.945712 4??0.703394?-0.764552?-1.214379??0.289643 5??1.928313?-1.376593?-1.557721??0.289643


用前面的值替換缺失值(method='pad'):


???????col1??????col2??????col3??????col4 0?-0.112415?-0.768180?-0.084859??0.296691 1?-1.777315?-0.768180?-0.166615?-0.628756 2?-0.629461??1.892790?-1.850006??0.157567 3??0.544860?-1.230804??0.836615?-0.945712 4??0.703394?-0.764552?-1.214379?-0.945712 5??1.928313?-1.376593?-1.557721??0.289643


用0替換缺失值:


???????col1??????col2??????col3??????col4 0?-0.112415?-0.768180?-0.084859??0.296691 1?-1.777315??0.000000?-0.166615?-0.628756 2?-0.629461??1.892790?-1.850006??0.157567 3??0.544860?-1.230804??0.836615?-0.945712 4??0.703394?-0.764552?-1.214379??0.000000 5??1.928313?-1.376593?-1.557721??0.289643


手動指定兩個缺失值分布為1.1和1.2:


???????col1??????col2??????col3??????col4 0?-0.112415?-0.768180?-0.084859??0.296691 1?-1.777315??1.100000?-0.166615?-0.628756 2?-0.629461??1.892790?-1.850006??0.157567 3??0.544860?-1.230804??0.836615?-0.945712 4??0.703394?-0.764552?-1.214379??1.200000 5??1.928313?-1.376593?-1.557721??0.289643


用平均數代替,選擇各自列的均值替換缺失值:


???????col1??????col2??????col3??????col4 0?-0.112415?-0.768180?-0.084859??0.296691 1?-1.777315?-0.449468?-0.166615?-0.628756 2?-0.629461??1.892790?-1.850006??0.157567 3??0.544860?-1.230804??0.836615?-0.945712 4??0.703394?-0.764552?-1.214379?-0.166113 5??1.928313?-1.376593?-1.557721??0.289643


以上示例中,直接指定 method 的方法適用于大多數情況,較為簡單直接;但使用 value 的方法則更為靈活,原因是可以通過函數的形式將缺失值的處理規則寫好,然后直接賦值即可。限于篇幅,不對所有方法做展開講解。


另外,如果是直接替換為特定值的應用,也可以考慮使用Pandas的 replace 功能。本示例的 df (原始數據框)可直接使用 df.replace(np.nan,0),這種用法更加簡單粗暴,但也能達到效果。當然,replace的出現是為了解決各種替換應用的,缺失值只是其中的一種應用而已。


上述過程中,主要需要考慮的關鍵點是缺失值的替換策略,可指定多種方法替換缺失值,具體根據實際需求而定,但大多數情況下均值、眾數和中位數的方法較為常用。如果場景固定,也可以使用特定值(例如0)替換。


在使用不同的缺失值策略時,需要注意以下幾個問題:


  • 缺失值的處理的前提是已經可以正確識別所有缺失值字段,關于識別的問題在使用Pandas讀取數據時可通過設置 na_values 的值指定。但是如果數據已經讀取完畢并且不希望再重新讀取,那可以使用Pandas的 replace 功能將指定的字符串(或列表)替換為 NaN。更有效的是,如果數據中的缺失值太多而無法通過列表形式窮舉時,replace 還支持正則表達式的寫法。
  • 當列中的數據全部為空值時,任何替換方法都將失效,任何基于中位數、眾數和均值的策略都將失效。除了可以使用固定值替換外(這種情況下即使替換了該特征也沒有實際參與模型的價值),最合理的方式是先將全部為缺失值的列刪除,然后再做其他處理。
  • 當列中含有極大值或極小值的 inf-inf 時,會使得 mean() 這種方法失效,因為這種情況下將無法計算出均值。應對思路是使用 median 中位數做兜底策略,只要列中有數據,就一定會有中位數。


  • 02 異常值處理


    有關異常值的確定有很多規則和方法,這里使用Z標準化得到的閾值作為判斷標準:當標準化后的得分超過閾值則為異常。完整代碼如下。


    示例代碼分為3個部分。


    1. 導入本例需要的Pandas庫


    import?pandas?as?pd??#?導入Pandas庫


    2. 生成異常數據


    df?=?pd.DataFrame({'col1':?[1,?120,?3,?5,?2,?12,?13],'col2':?[12,?17,?31,?53,?22,?32,?43]}) print(df)??#?打印輸出


    直接通過DataFrame創建一個7行2列的數據框,打印輸出結果如下:


    ???col1??col2 0?????1????12 1???120????17 2?????3????31 3?????5????53 4?????2????22 5????12????32 6????13????43


    3. 為通過Z-Score方法判斷異常值


    df_zscore?=?df.copy()??????????????????#?復制一個用來存儲Z-score得分的數據框 cols?=?df.columns??????????????????#?獲得數據框的列名 for?col?in?cols:??????????????????????#?循環讀取每列df_col?=?df[col]??????????????????#?得到每列的值z_score?=?(df_col?-?df_col.mean())?/?df_col.std()??#?計算每列的Z-score得分df_zscore[col]?=?z_score.abs()?>?2.2????????#?判斷Z-score得分是否大于2.2,如果是則為True,否則為False print(df_zscore)??????????????????????#?打印輸出


    本過程中,先通過 df.copy() 復制一個原始數據框的副本,用來存儲Z-Score標準化后的得分,再通過 df.columns 獲得原始數據框的列名,接著通過循環判斷每一列中的異常值。在判斷邏輯中,對每一列的數據進行使用自定義的方法做Z-Score值標準化得分計算,然后與閾值2.2做比較,如果大于閾值則為異常。本段代碼返回結果如下:


    ????col1???col2 0??False??False 1???True??False 2??False??False 3??False??False 4??False??False 5??False??False 6??False??False


    在本示例方法中,閾值的設定是確定異常與否的關鍵,通常當閾值大于2.2時,就是相對異常的表現值。


    4. 刪除帶有異常值所在的記錄行


    df_drop_outlier?=?df[df_zscore['col1']?==?False] print(df_drop_outlier)


    本段代碼里我們直接使用了Pandas的選擇功能,即只保留在 df_zscore 中異常列(col1)為 False 的列。完成后在輸出的結果中可以看到,刪除了?index 值為1的數據行。


    ???col1??col2 0?????1????12 2?????3????31 3?????5????53 4?????2????22 5????12????32 6????13????43


    上述過程中,主要需要考慮的關鍵點是:如何判斷異常值。


    對于有固定業務規則的可直接套用業務規則,而對于沒有固定業務規則的,可以采用常見的數學模型進行判斷:


    • 基于概率分布的模型(例如正態分布的標準差范圍)
    • 基于聚類的方法(例如KMeans)
    • 基于密度的方法(例如LOF)
    • 基于分類的方法(例如KNN)
    • 基于統計的方法(例如分位數法)等。


    異常值的定義帶有較強的主觀判斷色彩,具體需要根據實際情況選擇。



    03 重復值處理


    有關重復值的處理代碼分為4個部分。


    1. 導入用到的Pandas庫


    import?pandas?as?pd??#?導入Pandas庫


    2. 生成重復數據


    data1,?data2,?data3,?data4?=?['a',?3],?['b',?2],?['a',?3],?['c',?2] df?=?pd.DataFrame([data1,?data2,?data3,?data4],?columns=['col1',?'col2']) print(df)


    在代碼中,我們在一列中直接給4個對象賦值,也可以拆分為4行分別賦值。該數據是一個4行2列數據框,數據結果如下:


    ??col1??col2 0????a?????3 1????b?????2 2????a?????3 3????c?????2


    3. 判斷重復數據


    isDuplicated?=?df.duplicated()????#?判斷重復數據記錄 print(isDuplicated)??????????#?打印輸出


    判斷數據記錄是否為重復值,返回每條數據記錄是否重復結果,取值為 TrueFalse。判斷方法為 df.duplicated(),該方法中兩個主要的參數是 subsetkeep


    • subset:要判斷重復值的列,可以指定特定列或多個列。默認使用全部列。
    • keep:當重復時不標記為True的規則,可設置為第1個(first)、最后一個(last)和全部標記為True(False)。默認使用first,即第1個重復值不標記為True。


    結果如下:


    0????False 1????False 2?????True 3????False dtype:?bool


    4. 刪除重復值


    print(df.drop_duplicates())???????????#?刪除數據記錄中所有列值相同的記錄 print(df.drop_duplicates(['col1']))???????#?刪除數據記錄中col1值相同的記錄 print(df.drop_duplicates(['col2']))???????#?刪除數據記錄中col2值相同的記錄 print(df.drop_duplicates(['col1',?'col2']))??#?刪除數據記錄中指定列(col1/col2)值相同的記錄


    該操作的核心方法是 df.drop_duplicates(),該方法的作用是基于指定的規則判斷為重復值之后,刪除重復值,其參數跟 df.duplicated() 完全相同。在該部分方法示例中,依次使用默認規則(全部列相同的數據記錄)、col1列相同、col2列相同以及指定col1和col2完全相同4種規則進行去重。返回結果如下。


    刪除數據記錄中所有列值相同的記錄,index為2的記錄行被刪除:


    ??col1??col2 0????a?????3 1????b?????2 3????c?????2


    刪除數據記錄中col1值相同的記錄,index為2的記錄行被刪除:


    ??col1??col2 0????a?????3 1????b?????2 3????c?????2


    刪除數據記錄中col2值相同的記錄,index為2和3的記錄行被刪除:


    ??col1??col2 0????a?????3 1????b?????2


    刪除數據記錄中指定列(col1和col2)值相同的記錄,index為2的記錄行被刪除:


    ??col1??col2 0????a?????3 1????b?????2 3????c?????2


    提示:由于數據是通過隨機數產生,因此讀者操作的結果可能與上述示例的數據結果不同。


    除了可以使用Pandas來做重復值判斷和處理外,也可以使用Numpy中的 unique() 方法,該方法返回其參數數組中所有不同的值,并且按照從小到大的順序排列。Python自帶的內置函數 set 方法也能返回唯一元素的集合。


    上述過程中,主要需要考慮的關鍵點是:如何對重復值進行處理。重復值的判斷相對簡單,而判斷之后如何處理往往不是一個技術特征明顯的工作,而是側重于業務和建模需求的工作。


    關于作者:宋天龍,深大數據技術專家,觸脈咨詢合伙人兼副總裁,前Webtrekk中國區技術和咨詢負責人(德國最大在線數據分析服務提供商)。擅長數據挖掘、建模、分析與運營,精通端到端數據價值場景設計、業務需求轉換、數據結構梳理、數據建模與學習以及數據工程交付。在電子商務、零售、銀行、保險等多個行業擁有豐富的數據項目工作經驗。


    本文摘編自Python數據分析與數據化運營(第2版),經出版方授權發布。


    延伸閱讀《Python數據分析與數據化運營

    (第2版)

    點擊上圖了解及購買

    轉載請聯系微信:DoctorData


    推薦語:這是一本將數據分析技術與數據使用場景深度結合的著作,從實戰角度講解了如何利用Python進行數據分析和數據化運營。本書與同類書大的不同在于,并不只有純粹的關于數據分析技術和工具的講解,而且還與數據使用場景深度結合,在業務上真正可指導落地。此外,本書作者提供微信、郵箱等,可通過實時和離線兩種方式及時為讀者在線傳道、受業、解惑。



    「大數據」內容合伙人之「鑒書小分隊」上線啦!


    最近,你都在讀什么書?有哪些心得體會想要跟大家分享?


    數據叔最近搞了個大事——聯合優質圖書出版商機械工業出版社華章公司發起鑒書活動。


    簡單說就是:你可以免費讀新書,你可以免費讀新書的同時,順手碼一篇讀書筆記就行。詳情請在大數據公眾號后臺對話框回復合伙人查看。



    福利時間?


    北京第二十六屆國際圖書博覽會(BIBF)如約而至

    愛讀書的你絕對不能錯過!

    數據叔的福利也如約而至

    報名參加BIBF華章圖書現場活動的小伙伴們

    即可來展位報銷門票喲



    有話要說?


    Q:?關于數據清洗,你還有哪些問題?

    歡迎留言與大家分享


    猜你想看?


    • 從游戲AI到自動駕駛,一文看懂強化學習的概念及應用

    • 什么是機器學習?有哪些分類?到底有什么用?終于有人講明白了

    • 6本豆瓣高分書,國內外的技術大牛都在看!

    • 關于機器學習的知識點,全在這篇文章里了


    更多精彩?


    在公眾號對話框輸入以下關鍵詞

    查看更多優質內容!


    PPT?|?報告?|?讀書?|?書單?|?干貨?

    大數據?|?揭秘?|?Python?|?可視化

    AI?|?人工智能?|?5G?|?區塊鏈

    機器學習?|?深度學習?|?神經網絡

    合伙人?|?1024?|?段子?|?數學?|?高考


    據統計,99%的大咖都完成了這個神操作

    ?



    覺得不錯,請把這篇文章分享給你的朋友

    轉載 / 投稿請聯系:baiyu@hzbook.com

    更多精彩,請在后臺點擊“歷史文章”查看

    點擊閱讀原文,了解更多

    總結

    以上是生活随笔為你收集整理的Python代码实操:详解数据清洗的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。