最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用Pandas處理缺失值的技巧分享

 更新時(shí)間:2025年10月29日 09:06:49   作者:傻啦嘿喲  
爬蟲(chóng)抓取的數(shù)據(jù)就像剛從泥坑里挖出來(lái)的土豆,表面沾滿(mǎn)泥土(缺失值、重復(fù)值、異常值),內(nèi)部可能還有壞掉的部分(無(wú)效數(shù)據(jù)),本文聚焦最讓人頭疼的缺失值問(wèn)題,用Python的Pandas庫(kù)演示如何像處理食材一樣清洗數(shù)據(jù),讓臟數(shù)據(jù)變成可直接分析的凈數(shù)據(jù),需要的朋友可以參考下

一、缺失值的三種形態(tài)

爬蟲(chóng)數(shù)據(jù)中的缺失值通常以三種形式存在:

  • 顯性缺失:直接顯示為NoneNaN(Not a Number)
  • 隱性缺失:用特殊值代替(如"-"、"N/A"、"0")
  • 結(jié)構(gòu)缺失:整行/整列數(shù)據(jù)缺失(如JSON解析失敗導(dǎo)致的空字典)
import pandas as pd
import numpy as np
 
# 模擬爬蟲(chóng)數(shù)據(jù)
data = {
    '商品名稱(chēng)': ['iPhone13', '華為Mate50', None, '小米13', 'N/A'],
    '價(jià)格': [5999, 4999, np.nan, 3999, '-'],
    '銷(xiāo)量': [1200, 800, 0, 1500, None],
    '庫(kù)存': ['有貨', '缺貨', '有貨', '有貨', '']
}
df = pd.DataFrame(data)

二、缺失值檢測(cè)四步法

1. 快速概覽缺失情況

# 查看每列缺失值數(shù)量
print(df.isnull().sum())
 
# 查看缺失值比例
print(df.isnull().mean().round(2))

輸出結(jié)果會(huì)顯示每列有多少缺失值及其占比,幫助判斷哪些字段需要重點(diǎn)處理。

2. 可視化缺失分布

import missingno as msno
 
msno.matrix(df.sample(5))  # 隨機(jī)展示5行數(shù)據(jù)的缺失矩陣
msno.bar(df)  # 柱狀圖展示各列缺失比例

3. 識(shí)別隱性缺失

# 自定義隱性缺失值列表
hidden_missing = ['-', 'N/A', '無(wú)', '未知', '']
 
# 檢測(cè)包含隱性缺失的列
for col in df.columns:
    if df[col].dtype in ['object', 'string']:
        missing_count = df[col].isin(hidden_missing).sum()
        if missing_count > 0:
            print(f"{col}列發(fā)現(xiàn){missing_count}個(gè)隱性缺失值")

4. 結(jié)構(gòu)缺失檢測(cè)

# 檢查是否有整行為空的情況
print("整行為空的記錄數(shù):", df.isnull().all(axis=1).sum())
 
# 檢查特定列組合缺失模式
print(df[['價(jià)格', '銷(xiāo)量']].isnull().sum())

三、缺失值處理實(shí)戰(zhàn)方案

方案1:直接刪除(適用于缺失率<30%的列)

# 刪除包含缺失值的行(謹(jǐn)慎使用)
df_drop_rows = df.dropna()
 
# 刪除缺失值超過(guò)50%的列
threshold = len(df) * 0.5
df_drop_cols = df.dropna(thresh=threshold, axis=1)
 
# 指定列刪除(當(dāng)價(jià)格缺失時(shí)刪除整行)
df_drop_specific = df.dropna(subset=['價(jià)格'])

方案2:填充固定值(適用于分類(lèi)數(shù)據(jù))

# 用"未知"填充商品名稱(chēng)缺失
df['商品名稱(chēng)'] = df['商品名稱(chēng)'].fillna('未知')
 
# 用0填充銷(xiāo)量缺失(需確認(rèn)業(yè)務(wù)邏輯)
df['銷(xiāo)量'] = df['銷(xiāo)量'].fillna(0)
 
# 批量處理文本列的隱性缺失
text_cols = ['商品名稱(chēng)', '庫(kù)存']
for col in text_cols:
    df[col] = df[col].replace(hidden_missing, '未知')

方案3:統(tǒng)計(jì)量填充(適用于數(shù)值數(shù)據(jù))

# 用中位數(shù)填充價(jià)格(抗異常值干擾)
median_price = df['價(jià)格'].median()
df['價(jià)格'] = df['價(jià)格'].replace('-', np.nan).fillna(median_price)
 
# 用均值填充銷(xiāo)量(需數(shù)據(jù)分布均勻)
mean_sales = df['銷(xiāo)量'].mean()
df['銷(xiāo)量'] = df['銷(xiāo)量'].fillna(mean_sales)
 
# 前向填充(時(shí)間序列數(shù)據(jù)適用)
df['價(jià)格'] = df['價(jià)格'].fillna(method='ffill')

方案4:模型預(yù)測(cè)填充(適用于關(guān)鍵字段)

from sklearn.ensemble import RandomForestRegressor
 
# 準(zhǔn)備數(shù)據(jù)(示例:用其他特征預(yù)測(cè)價(jià)格)
known = df[df['價(jià)格'].notna()]
unknown = df[df['價(jià)格'].isna()]
 
X_known = known[['銷(xiāo)量', '庫(kù)存']]
y_known = known['價(jià)格']
X_unknown = unknown[['銷(xiāo)量', '庫(kù)存']]
 
# 訓(xùn)練模型并預(yù)測(cè)
model = RandomForestRegressor(n_estimators=100)
model.fit(X_known, y_known)
predicted_prices = model.predict(X_unknown)
 
# 填充缺失值
df.loc[df['價(jià)格'].isna(), '價(jià)格'] = predicted_prices

方案5:插值法(適用于有序數(shù)據(jù))

# 創(chuàng)建帶時(shí)間索引的示例數(shù)據(jù)
dates = pd.date_range('2023-01-01', periods=5)
temp_data = {'溫度': [22, np.nan, 25, np.nan, 28]}
temp_df = pd.DataFrame(temp_data, index=dates)
 
# 線性插值
temp_df['溫度'] = temp_df['溫度'].interpolate()
 
# 時(shí)間加權(quán)插值(更平滑)
temp_df['溫度'] = temp_df['溫度'].interpolate(method='time')

四、缺失值處理進(jìn)階技巧

1. 分組填充(不同類(lèi)別不同策略)

# 按庫(kù)存狀態(tài)分組填充價(jià)格
def fill_price(group):
    if group.name == '有貨':
        return group.fillna(group.median())
    else:
        return group.fillna(0)  # 缺貨商品可能標(biāo)0價(jià)
 
df['價(jià)格'] = df.groupby('庫(kù)存')['價(jià)格'].apply(fill_price)

2. 多重填充策略組合

# 先填充隱性缺失,再填充顯性缺失
for col in ['價(jià)格', '銷(xiāo)量']:
    # 處理隱性缺失
    if df[col].dtype == 'object':
        df[col] = df[col].replace('-', np.nan)
    
    # 根據(jù)缺失率選擇填充方式
    missing_rate = df[col].isna().mean()
    if missing_rate < 0.1:
        df[col] = df[col].fillna(df[col].median())
    elif missing_rate < 0.3:
        df[col] = df[col].fillna(df[col].mean())
    else:
        df[col] = df[col].fillna(-1)  # 標(biāo)記特殊值

3. 缺失值標(biāo)記法(保留信息)

# 創(chuàng)建缺失標(biāo)記列
for col in ['價(jià)格', '銷(xiāo)量']:
    df[f'{col}_is_missing'] = df[col].isna().astype(int)
 
# 然后填充缺失值
df['價(jià)格'] = df['價(jià)格'].fillna(df['價(jià)格'].median())

五、處理后的數(shù)據(jù)驗(yàn)證

# 驗(yàn)證缺失值是否處理完成
print("剩余缺失值數(shù)量:\n", df.isnull().sum())
 
# 檢查填充值是否合理
print("價(jià)格描述統(tǒng)計(jì):\n", df['價(jià)格'].describe())
print("銷(xiāo)量分布:\n", df['銷(xiāo)量'].value_counts())
 
# 可視化驗(yàn)證
import matplotlib.pyplot as plt
 
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
df['價(jià)格'].plot(kind='hist', title='價(jià)格分布')
plt.subplot(1, 2, 2)
df['銷(xiāo)量'].plot(kind='hist', title='銷(xiāo)量分布')
plt.tight_layout()
plt.show()

常見(jiàn)問(wèn)題Q&A

Q1:被網(wǎng)站封IP怎么辦?
A:立即啟用備用代理池,建議使用住宅代理(如站大爺IP代理),配合每請(qǐng)求更換IP策略。更穩(wěn)妥的方式是使用爬蟲(chóng)框架(如Scrapy)的中間件實(shí)現(xiàn)自動(dòng)切換。

Q2:如何選擇填充值?
A:根據(jù)數(shù)據(jù)類(lèi)型和業(yè)務(wù)邏輯決定:

  • 數(shù)值型:中位數(shù)(抗異常值)> 均值(數(shù)據(jù)分布均勻時(shí))> 固定值
  • 類(lèi)別型:眾數(shù) > "未知" > 新類(lèi)別
  • 時(shí)間序列:插值法 > 前向填充 > 固定值

Q3:缺失值處理會(huì)影響數(shù)據(jù)分析結(jié)果嗎?
A:會(huì)。不當(dāng)處理可能導(dǎo)致:

  • 均值/方差計(jì)算偏差
  • 模型過(guò)擬合(如用均值填充造成虛假集中趨勢(shì))
  • 分類(lèi)模型準(zhǔn)確率下降(錯(cuò)誤填充改變數(shù)據(jù)分布)

Q4:什么時(shí)候應(yīng)該刪除缺失值?
A:滿(mǎn)足以下條件時(shí)考慮刪除:

  • 缺失率超過(guò)70%的列
  • 關(guān)鍵字段缺失的記錄(如訂單ID缺失)
  • 缺失機(jī)制完全隨機(jī)(MCAR)且樣本量充足

Q5:如何自動(dòng)化缺失值處理流程?
A:可創(chuàng)建處理管道:

from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
 
def preprocess_data(df):
    numeric_features = ['價(jià)格', '銷(xiāo)量']
    categorical_features = ['商品名稱(chēng)', '庫(kù)存']
    
    numeric_transformer = Pipeline(steps=[
        ('imputer', SimpleImputer(strategy='median'))
    ])
    
    categorical_transformer = Pipeline(steps=[
        ('imputer', SimpleImputer(strategy='constant', fill_value='未知'))
    ])
    
    # 實(shí)際應(yīng)用中可使用ColumnTransformer組合處理
    # 此處僅為示例結(jié)構(gòu)
    return processed_df

結(jié)語(yǔ)

處理缺失值就像修理一輛二手車(chē):不是簡(jiǎn)單更換損壞零件,而是要理解每個(gè)缺失背后的原因。有時(shí)缺失本身就包含信息(如用戶(hù)未填寫(xiě)收入可能暗示低收入群體),過(guò)度填充反而會(huì)丟失價(jià)值。建議每次處理后都保存處理日志,記錄缺失率、填充策略和驗(yàn)證結(jié)果,為后續(xù)分析提供可追溯的依據(jù)。

以上就是Python使用Pandas處理缺失值的技巧分享的詳細(xì)內(nèi)容,更多關(guān)于Python Pandas處理缺失值的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用OpenCV-python3實(shí)現(xiàn)滑動(dòng)條更新圖像的Canny邊緣檢測(cè)功能

    使用OpenCV-python3實(shí)現(xiàn)滑動(dòng)條更新圖像的Canny邊緣檢測(cè)功能

    這篇文章主要介紹了使用OpenCV-python3實(shí)現(xiàn)滑動(dòng)條更新圖像的Canny邊緣檢測(cè)功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Python?web框架實(shí)現(xiàn)增加BasicAuth認(rèn)證詳解

    Python?web框架實(shí)現(xiàn)增加BasicAuth認(rèn)證詳解

    這篇文章主要為大家詳細(xì)介紹了Python如何在web框架中實(shí)現(xiàn)增加BasicAuth認(rèn)證,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-05-05
  • Python統(tǒng)計(jì)詞頻的幾種方法小結(jié)

    Python統(tǒng)計(jì)詞頻的幾種方法小結(jié)

    本文主要介紹了Python統(tǒng)計(jì)詞頻的幾種方法小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 基于python讀取.mat文件并取出信息

    基于python讀取.mat文件并取出信息

    這篇文章主要介紹了基于python讀取.mat文件并取出信息,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 詳解python之配置日志的幾種方式

    詳解python之配置日志的幾種方式

    本篇文章主要介紹了詳解python之配置日志的幾種方式,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • IntelliJ 中配置 Anaconda的過(guò)程圖解

    IntelliJ 中配置 Anaconda的過(guò)程圖解

    這篇文章主要介紹了IntelliJ 中配置 Anaconda過(guò)程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Python 使用雙重循環(huán)打印圖形菱形操作

    Python 使用雙重循環(huán)打印圖形菱形操作

    這篇文章主要介紹了Python 使用雙重循環(huán)打印圖形菱形操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • Django緩存Cache使用詳解

    Django緩存Cache使用詳解

    這篇文章主要介紹了Django緩存Cache使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • TensorFlow梯度求解tf.gradients實(shí)例

    TensorFlow梯度求解tf.gradients實(shí)例

    今天小編就為大家分享一篇TensorFlow梯度求解tf.gradients實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • python導(dǎo)入三方包的顯示未解析的引用但是可以運(yùn)行問(wèn)題解決

    python導(dǎo)入三方包的顯示未解析的引用但是可以運(yùn)行問(wèn)題解決

    如果 PyCharm 顯示未解析的引用,有可能是因?yàn)槟诖a中使用了未安裝的庫(kù)或者模塊,或者是因?yàn)?nbsp;PyCharm 沒(méi)有正確配置解釋器,這篇文章主要介紹了python導(dǎo)入三方包的顯示未解析的引用但是可以運(yùn)行問(wèn)題的解決辦法
    2025-12-12

最新評(píng)論

郯城县| 阿勒泰市| 玉屏| 南靖县| 平远县| 黑河市| 衡阳市| 息烽县| 无锡市| 普安县| 营口市| 安泽县| 吉水县| 炎陵县| 小金县| 剑河县| 保山市| 西乡县| 赤峰市| 黑龙江省| 桐柏县| 会泽县| 雅安市| 商丘市| 泰顺县| 翁牛特旗| 河北区| 金秀| 肇庆市| 东海县| 鹤庆县| 青冈县| 宜宾市| 太仆寺旗| 织金县| 淮安市| 新龙县| 黔南| 武穴市| 加查县| 平昌县|