缺失值处理

  • 缺失值首先需要根据实际情况定义
  • 可以采取直接删除法
  • 有时候需要使用替换法或者插值法
  • 常用的替换法有均值替换、前向、后向替换和常数替换
import pandas as pd
import numpy as np
import os
os.getcwd()
'D:\\Jupyter\\notebook\\Python数据清洗实战\\数据清洗之数据预处理'
os.chdir('D:\\Jupyter\\notebook\\Python数据清洗实战\\数据')
df = pd.read_csv('MotorcycleData.csv', encoding='gbk', na_values='Na')
def f(x):
    if '$' in str(x):
        x = str(x).strip('$')
        x = str(x).replace(',', '')
    else:
        x = str(x).replace(',', '')
    return float(x)
df['Price'] = df['Price'].apply(f)
df['Mileage'] = df['Mileage'].apply(f)
# 计算缺失比例
df.apply(lambda x: sum(x.isnull())/len(x), axis=0)
Condition         0.000000
Condition_Desc    0.778994
Price             0.000000
Location          0.000267
Model_Year        0.000534
Mileage           0.003470
Exterior_Color    0.095422
Make              0.000534
Warranty          0.318297
Model             0.016415
Sub_Model         0.676231
Type              0.197785
Vehicle_Title     0.964233
OBO               0.008808
Feedback_Perc     0.117710
Watch_Count       0.530629
N_Reviews         0.000801
Seller_Status     0.083411
Vehicle_Tile      0.007207
Auction           0.002269
Buy_Now           0.031630
Bid_Count         0.707727
dtype: float64
df.head(3)
ConditionCondition_DescPriceLocationModel_YearMileageExterior_ColorMakeWarrantyModel...Vehicle_TitleOBOFeedback_PercWatch_CountN_ReviewsSeller_StatusVehicle_TileAuctionBuy_NowBid_Count
0Usedmint!!! very low miles11412.0McHenry, Illinois, United States2013.016000.0BlackHarley-DavidsonUnspecifiedTouring...NaNFALSE8.1NaN2427Private SellerClearTrueFALSE28.0
1UsedPerfect condition17200.0Fort Recovery, Ohio, United States2016.060.0BlackHarley-DavidsonVehicle has an existing warrantyTouring...NaNFALSE10017657Private SellerClearTrueTRUE0.0
2UsedNaN3872.0Chicago, Illinois, United States1970.025763.0Silver/BlueBMWVehicle does NOT have an existing warrantyR-Series...NaNFALSE100NaN136NaNClearTrueFALSE26.0

3 rows × 22 columns

# how = 'all', 只有当前行都是缺失值才删除
# how = 'any', 只要当前行有一个缺失值就删除
df.dropna(how = 'any', axis=0)
ConditionCondition_DescPriceLocationModel_YearMileageExterior_ColorMakeWarrantyModel...Vehicle_TitleOBOFeedback_PercWatch_CountN_ReviewsSeller_StatusVehicle_TileAuctionBuy_NowBid_Count

0 rows × 22 columns

# subset 根据指定字段判断
# df.dropna(how='any', subset=['Condition', 'Price', 'Mileage'])
# 缺失值使用0填补
df.fillna(0).head(5)
ConditionCondition_DescPriceLocationModel_YearMileageExterior_ColorMakeWarrantyModel...Vehicle_TitleOBOFeedback_PercWatch_CountN_ReviewsSeller_StatusVehicle_TileAuctionBuy_NowBid_Count
0Usedmint!!! very low miles11412.0McHenry, Illinois, United States2013.016000.0BlackHarley-DavidsonUnspecifiedTouring...0FALSE8.102427Private SellerClearTrueFALSE28.0
1UsedPerfect condition17200.0Fort Recovery, Ohio, United States2016.060.0BlackHarley-DavidsonVehicle has an existing warrantyTouring...0FALSE10017657Private SellerClearTrueTRUE0.0
2Used03872.0Chicago, Illinois, United States1970.025763.0Silver/BlueBMWVehicle does NOT have an existing warrantyR-Series...0FALSE10001360ClearTrueFALSE26.0
3UsedCLEAN TITLE READY TO RIDE HOME6575.0Green Bay, Wisconsin, United States2009.033142.0RedHarley-Davidson0Touring...0FALSE10002920DealerClearTrueFALSE11.0
4Used010000.0West Bend, Wisconsin, United States2012.017800.0BlueHarley-DavidsonNO WARRANTYTouring...0FALSE10013271OWNERClearTrueTRUE0.0

5 rows × 22 columns

# 针对一个变量进行缺失值判断,使用其均值进行填补
df.Mileage.fillna(df.Mileage.mean()).head(5)
0    16000.0
1       60.0
2    25763.0
3    33142.0
4    17800.0
Name: Mileage, dtype: float64
df.columns
Index(['Condition', 'Condition_Desc', 'Price', 'Location', 'Model_Year',
       'Mileage', 'Exterior_Color', 'Make', 'Warranty', 'Model', 'Sub_Model',
       'Type', 'Vehicle_Title', 'OBO', 'Feedback_Perc', 'Watch_Count',
       'N_Reviews', 'Seller_Status', 'Vehicle_Tile', 'Auction', 'Buy_Now',
       'Bid_Count'],
      dtype='object')
df[df['Exterior_Color'].isnull()].head(5)
ConditionCondition_DescPriceLocationModel_YearMileageExterior_ColorMakeWarrantyModel...Vehicle_TitleOBOFeedback_PercWatch_CountN_ReviewsSeller_StatusVehicle_TileAuctionBuy_NowBid_Count
14UsedNaN5500.0Davenport, Iowa, United States2008.022102.0NaNHarley-DavidsonVehicle does NOT have an existing warrantyTouring...NaNFALSE9.3NaN244Private SellerClearTrueFALSE16.0
35UsedNaN7700.0Roselle, Illinois, United States2007.010893.0NaNHarley-DavidsonNaNOther...NaNFALSE100NaN236NaNClearFalseTRUENaN
41UsedNaN6800.0Hampshire, Illinois, United States2003.055782.0NaNHarley-DavidsonVehicle does NOT have an existing warrantySoftail...NaNTRUE1002<298Private SellerClearFalseTRUENaN
55UsedNaN29500.0Parma, Michigan, United States1950.08471.0NaNHarley-DavidsonNaNOther...NaNTRUE10024216NaNClearFalseTRUENaN
72UsedNaN6500.0Bourbonnais, Illinois, United States1986.055300.0NaNHarley-DavidsonNaNTouring...NaNTRUE1002<1Private SellerClearFalseTRUENaN

5 rows × 22 columns

# 求众数
df['Exterior_Color'].mode()[0]
'Black'
# 缺失用众数填补
df['Exterior_Color'].fillna(df['Exterior_Color'].mode()[0]).head(5)
0          Black
1          Black
2    Silver/Blue
3            Red
4           Blue
Name: Exterior_Color, dtype: object
df['Mileage'].median()
7083.0
# 对不同变量使用不同数据填补
# 不加inplace=True,不会对原数据生效
df.fillna(value={'Exterior_Color': df['Exterior_Color'].mode()[0], 
                'Mileage': df['Mileage'].median(),}).head(5)
ConditionCondition_DescPriceLocationModel_YearMileageExterior_ColorMakeWarrantyModel...Vehicle_TitleOBOFeedback_PercWatch_CountN_ReviewsSeller_StatusVehicle_TileAuctionBuy_NowBid_Count
0Usedmint!!! very low miles11412.0McHenry, Illinois, United States2013.016000.0BlackHarley-DavidsonUnspecifiedTouring...NaNFALSE8.1NaN2427Private SellerClearTrueFALSE28.0
1UsedPerfect condition17200.0Fort Recovery, Ohio, United States2016.060.0BlackHarley-DavidsonVehicle has an existing warrantyTouring...NaNFALSE10017657Private SellerClearTrueTRUE0.0
2UsedNaN3872.0Chicago, Illinois, United States1970.025763.0Silver/BlueBMWVehicle does NOT have an existing warrantyR-Series...NaNFALSE100NaN136NaNClearTrueFALSE26.0
3UsedCLEAN TITLE READY TO RIDE HOME6575.0Green Bay, Wisconsin, United States2009.033142.0RedHarley-DavidsonNaNTouring...NaNFALSE100NaN2920DealerClearTrueFALSE11.0
4UsedNaN10000.0West Bend, Wisconsin, United States2012.017800.0BlueHarley-DavidsonNO WARRANTYTouring...NaNFALSE10013271OWNERClearTrueTRUE0.0

5 rows × 22 columns

# 前向填补
df['Exterior_Color'].fillna(method='ffill').tail(10)
7483      Purple
7484      Purple
7485       Black
7486       Black
7487        Gray
7488       Black
7489       Black
7490         Red
7491    TWO TONE
7492        Gray
Name: Exterior_Color, dtype: object
# 后向填补
df['Exterior_Color'].fillna(method='bfill').tail(10)
7483      Purple
7484       Black
7485       Black
7486       Black
7487        Gray
7488       Black
7489       Black
7490         Red
7491    TWO TONE
7492        Gray
Name: Exterior_Color, dtype: object
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐