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

Python使用Pandas快速找出重復(fù)數(shù)據(jù)并生成清理報(bào)告

 更新時(shí)間:2026年01月26日 16:37:56   作者:站大爺IP  
Pandas作為Python數(shù)據(jù)處理的利器,提供了簡(jiǎn)單高效的重復(fù)數(shù)據(jù)處理方案,本文將通過(guò)真實(shí)案例,帶你掌握從重復(fù)檢測(cè)到生成專業(yè)清理報(bào)告的全流程,用代碼和可視化讓數(shù)據(jù)清洗變得可感知、可驗(yàn)證

引言:為什么數(shù)據(jù)重復(fù)是隱形殺手?

想象你正在分析電商平臺(tái)的銷(xiāo)售數(shù)據(jù),發(fā)現(xiàn)某款商品在同一天出現(xiàn)了3次相同的銷(xiāo)售記錄。這些重復(fù)數(shù)據(jù)就像數(shù)據(jù)倉(cāng)庫(kù)里的"幽靈訂單",會(huì)導(dǎo)致庫(kù)存計(jì)算錯(cuò)誤、銷(xiāo)售額虛高、用戶行為分析失真。更可怕的是,當(dāng)數(shù)據(jù)量達(dá)到百萬(wàn)級(jí)時(shí),這些重復(fù)項(xiàng)會(huì)像滾雪球一樣積累,最終讓你的分析結(jié)果偏離真相。

Pandas作為Python數(shù)據(jù)處理的利器,提供了簡(jiǎn)單高效的重復(fù)數(shù)據(jù)處理方案。本文將通過(guò)真實(shí)案例,帶你掌握從重復(fù)檢測(cè)到生成專業(yè)清理報(bào)告的全流程,用代碼和可視化讓數(shù)據(jù)清洗變得可感知、可驗(yàn)證。

一、重復(fù)數(shù)據(jù)的三種常見(jiàn)形態(tài)

1. 完全重復(fù)的行

import pandas as pd

data = {
    '訂單號(hào)': ['A001', 'A002', 'A001', 'A003'],
    '商品': ['手機(jī)', '耳機(jī)', '手機(jī)', '充電器'],
    '價(jià)格': [2999, 199, 2999, 89]
}
df = pd.DataFrame(data)

在這個(gè)示例中,第一行和第三行完全相同,屬于最容易識(shí)別的重復(fù)類(lèi)型。

2. 關(guān)鍵字段重復(fù)

當(dāng)訂單號(hào)相同但其他字段不同時(shí):

data = {
    '訂單號(hào)': ['B001', 'B001', 'B002'],
    '商品': ['手機(jī)', '手機(jī)殼', '充電器'],
    '數(shù)量': [1, 2, 1]
}

這種情況更隱蔽,需要定義業(yè)務(wù)關(guān)鍵字段(如訂單號(hào))作為檢測(cè)依據(jù)。

3. 近似重復(fù)記錄

由于數(shù)據(jù)錄入錯(cuò)誤產(chǎn)生的變體:

data = {
    '客戶名': ['張三', '張三 ', '張  三', 'zhangsan'],
    '電話': ['13800138000', '13800138000', '13800138000', '13800138000']
}

這類(lèi)重復(fù)需要結(jié)合模糊匹配技術(shù)處理,本文將聚焦前兩種明確重復(fù)類(lèi)型。

二、Pandas重復(fù)檢測(cè)四步法

1. 基礎(chǔ)檢測(cè):duplicated()方法

# 檢測(cè)完全重復(fù)行(默認(rèn)保留第一個(gè)出現(xiàn))
duplicates = df[df.duplicated()]
print(duplicates)

輸出結(jié)果會(huì)顯示所有重復(fù)行(不包括首次出現(xiàn)的行)。通過(guò)參數(shù)控制:

  • keep='first'(默認(rèn)):標(biāo)記后續(xù)重復(fù)項(xiàng)
  • keep='last':標(biāo)記首次到倒數(shù)第二次的重復(fù)項(xiàng)
  • keep=False:標(biāo)記所有重復(fù)項(xiàng)

2. 指定關(guān)鍵字段檢測(cè)

# 只根據(jù)訂單號(hào)檢測(cè)重復(fù)
key_duplicates = df[df.duplicated(subset=['訂單號(hào)'])]

這在處理訂單數(shù)據(jù)時(shí)特別有用,可以確保每個(gè)訂單唯一性。

3. 統(tǒng)計(jì)重復(fù)頻率

# 統(tǒng)計(jì)每個(gè)訂單號(hào)的出現(xiàn)次數(shù)
duplicate_counts = df['訂單號(hào)'].value_counts()

# 篩選出重復(fù)的訂單號(hào)
repeated_orders = duplicate_counts[duplicate_counts > 1]
print(repeated_orders)

這種方法能快速定位高頻重復(fù)的字段值。

4. 可視化重復(fù)分布

import matplotlib.pyplot as plt

# 繪制重復(fù)訂單數(shù)量分布
duplicate_counts.value_counts().sort_index().plot(kind='bar')
plt.title('重復(fù)訂單數(shù)量分布')
plt.xlabel('重復(fù)次數(shù)')
plt.ylabel('訂單數(shù)量')
plt.show()

可視化能直觀展示重復(fù)問(wèn)題的嚴(yán)重程度,比如發(fā)現(xiàn)80%的重復(fù)訂單只重復(fù)2次,而少數(shù)訂單重復(fù)了10次以上。

三、數(shù)據(jù)清理實(shí)戰(zhàn):從檢測(cè)到修復(fù)

案例:電商訂單數(shù)據(jù)清洗

假設(shè)我們有一個(gè)包含10萬(wàn)條記錄的訂單數(shù)據(jù)集:

# 生成模擬數(shù)據(jù)
import numpy as np
np.random.seed(42)

orders = {
    '訂單號(hào)': [f'ORD{str(i).zfill(6)}' for i in range(100000)],
    '客戶ID': np.random.randint(1000, 9999, size=100000),
    '商品ID': np.random.randint(100, 999, size=100000),
    '金額': np.round(np.random.uniform(10, 1000, size=100000), 2),
    '下單時(shí)間': pd.date_range('2023-01-01', periods=100000, freq='min')
}

# 故意制造5%的重復(fù)數(shù)據(jù)
df = pd.DataFrame(orders)
duplicate_mask = np.random.rand(len(df)) < 0.05
df_duplicates = df[duplicate_mask].copy()

# 給重復(fù)數(shù)據(jù)添加微小變化(模擬數(shù)據(jù)錄入錯(cuò)誤)
for col in ['金額', '客戶ID']:
    df_duplicates[col] += np.random.uniform(-0.5, 0.5, size=len(df_duplicates))

# 合并數(shù)據(jù)集
df = pd.concat([df, df_duplicates]).reset_index(drop=True)

1. 全面檢測(cè)重復(fù)

# 完全重復(fù)檢測(cè)
exact_duplicates = df[df.duplicated()]
print(f"完全重復(fù)記錄數(shù): {len(exact_duplicates)}")

# 關(guān)鍵字段重復(fù)檢測(cè)(訂單號(hào)+客戶ID)
key_duplicates = df[df.duplicated(subset=['訂單號(hào)', '客戶ID'])]
print(f"關(guān)鍵字段重復(fù)記錄數(shù): {len(key_duplicates)}")

2. 智能去重策略

# 方法1:直接刪除完全重復(fù)行(保留第一個(gè))
df_cleaned1 = df.drop_duplicates()

# 方法2:對(duì)關(guān)鍵字段去重,保留金額最大的記錄(假設(shè)金額越大越可能是有效記錄)
def keep_max_amount(group):
    return group.loc[group['金額'].idxmax()]

df_cleaned2 = df.groupby(['訂單號(hào)', '客戶ID'], as_index=False).apply(keep_max_amount)

3. 清理效果驗(yàn)證

# 比較清理前后數(shù)據(jù)量
print(f"原始數(shù)據(jù)量: {len(df)}")
print(f"清理后數(shù)據(jù)量(方法1): {len(df_cleaned1)}")
print(f"清理后數(shù)據(jù)量(方法2): {len(df_cleaned2)}")

# 檢查是否還有重復(fù)
print("方法1是否還有重復(fù):", df_cleaned1.duplicated(subset=['訂單號(hào)', '客戶ID']).any())
print("方法2是否還有重復(fù):", df_cleaned2.duplicated(subset=['訂單號(hào)', '客戶ID']).any())

四、生成專業(yè)清理報(bào)告

1. 報(bào)告核心要素

  • 數(shù)據(jù)概覽:原始記錄數(shù)、清理后記錄數(shù)、減少比例
  • 重復(fù)類(lèi)型分布:完全重復(fù)/關(guān)鍵字段重復(fù)比例
  • 重復(fù)值統(tǒng)計(jì):高頻重復(fù)字段值TOP10
  • 清理策略說(shuō)明:采用何種去重邏輯
  • 可視化圖表:重復(fù)分布、清理效果對(duì)比

2. 自動(dòng)化報(bào)告生成代碼

from datetime import datetime

def generate_cleaning_report(df_original, df_cleaned, subset=None):
    # 計(jì)算關(guān)鍵指標(biāo)
    original_count = len(df_original)
    cleaned_count = len(df_cleaned)
    reduction_rate = (1 - cleaned_count/original_count) * 100
    
    # 檢測(cè)重復(fù)
    if subset:
        duplicates = df_original[df_original.duplicated(subset=subset)]
        duplicate_counts = df_original[subset[0]].value_counts()
        top_duplicates = duplicate_counts[duplicate_counts > 1].head(10)
    else:
        duplicates = df_original[df_original.duplicated()]
        top_duplicates = None
    
    # 創(chuàng)建報(bào)告內(nèi)容
    report = f"""
    === 數(shù)據(jù)清理報(bào)告 ===
    生成時(shí)間: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
    
    1. 數(shù)據(jù)概覽
    - 原始記錄數(shù): {original_count}
    - 清理后記錄數(shù): {cleaned_count}
    - 記錄減少比例: {reduction_rate:.2f}%
    
    2. 重復(fù)檢測(cè)結(jié)果
    {''.join([f"- 檢測(cè)依據(jù)字段: {', '.join(subset)}\n" for subset in ([subset] if subset else [])])}
    - 發(fā)現(xiàn)重復(fù)記錄數(shù): {len(duplicates)}
    """
    
    if top_duplicates is not None and not top_duplicates.empty:
        report += "\n3. 高頻重復(fù)值TOP10\n"
        report += top_duplicates.to_string()
    
    # 添加可視化(需要先運(yùn)行繪圖代碼)
    # 這里可以添加保存圖表的代碼,然后在報(bào)告中引用圖片路徑
    
    return report

# 生成報(bào)告
print(generate_cleaning_report(df, df_cleaned2, subset=['訂單號(hào)', '客戶ID']))

3. 高級(jí)可視化增強(qiáng)

# 創(chuàng)建畫(huà)布
fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# 重復(fù)記錄比例餅圖
duplicate_ratio = len(df[df.duplicated(subset=['訂單號(hào)', '客戶ID'])]) / len(df)
labels = ['唯一記錄', '重復(fù)記錄']
sizes = [1-duplicate_ratio, duplicate_ratio]
axes[0].pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90)
axes[0].set_title('重復(fù)記錄占比')

# 清理前后對(duì)比柱狀圖
counts = [len(df), len(df_cleaned2)]
axes[1].bar(['原始數(shù)據(jù)', '清理后'], counts, color=['blue', 'green'])
axes[1].set_title('數(shù)據(jù)量變化對(duì)比')
axes[1].set_ylabel('記錄數(shù)')

plt.tight_layout()
plt.savefig('cleaning_report_visualization.png')

五、最佳實(shí)踐與避坑指南

1. 關(guān)鍵注意事項(xiàng)

  • 備份原始數(shù)據(jù):清理前務(wù)必創(chuàng)建副本,避免不可逆操作
  • 業(yè)務(wù)理解優(yōu)先:與業(yè)務(wù)方確認(rèn)哪些字段組合定義唯一性
  • 漸進(jìn)式清理:先檢測(cè)小樣本,驗(yàn)證邏輯后再處理全量數(shù)據(jù)
  • 記錄清理日志:保存刪除的記錄ID和清理規(guī)則,便于追溯

2. 性能優(yōu)化技巧

  • 對(duì)于大數(shù)據(jù)集,使用chunksize參數(shù)分塊處理
  • 優(yōu)先檢測(cè)數(shù)值型字段,字符串比較更耗時(shí)
  • 考慮使用Dask庫(kù)處理超大規(guī)模數(shù)據(jù)(GB級(jí)別)

3. 常見(jiàn)錯(cuò)誤案例

錯(cuò)誤1:直接刪除所有重復(fù)行導(dǎo)致有效數(shù)據(jù)丟失

# 錯(cuò)誤示范:未指定subset參數(shù),可能誤刪有效數(shù)據(jù)
df.drop_duplicates(inplace=True)  # 危險(xiǎn)操作!

錯(cuò)誤2:忽略時(shí)間字段導(dǎo)致重復(fù)檢測(cè)不準(zhǔn)確

# 錯(cuò)誤示范:未考慮下單時(shí)間微小差異
df[df.duplicated(subset=['訂單號(hào)'])]  # 可能漏檢同訂單不同時(shí)間的記錄

錯(cuò)誤3:清理后未驗(yàn)證數(shù)據(jù)一致性

# 錯(cuò)誤示范:去重后未檢查關(guān)鍵字段唯一性
df_cleaned = df.drop_duplicates(subset=['訂單號(hào)'])
# 應(yīng)該添加驗(yàn)證
assert not df_cleaned.duplicated(subset=['訂單號(hào)']).any()

結(jié)語(yǔ):讓數(shù)據(jù)清洗成為可控的工程

通過(guò)本文介紹的方法,你不僅能高效檢測(cè)各種重復(fù)數(shù)據(jù),還能生成專業(yè)報(bào)告證明清理效果。記住,數(shù)據(jù)清洗不是簡(jiǎn)單的刪除操作,而是需要結(jié)合業(yè)務(wù)邏輯、數(shù)據(jù)分布和可視化驗(yàn)證的系統(tǒng)工程。

下次面對(duì)雜亂的數(shù)據(jù)時(shí),不妨按照這個(gè)流程:檢測(cè)→分析→清理→驗(yàn)證→報(bào)告。隨著實(shí)踐積累,你會(huì)逐漸建立起數(shù)據(jù)質(zhì)量感知能力,在復(fù)雜的數(shù)據(jù)迷宮中快速找到清理路徑。

到此這篇關(guān)于Python使用Pandas快速找出重復(fù)數(shù)據(jù)并生成清理報(bào)告的文章就介紹到這了,更多相關(guān)Python Pandas查找重復(fù)數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用VLC實(shí)現(xiàn)自動(dòng)播放視頻的操作方法

    使用VLC實(shí)現(xiàn)自動(dòng)播放視頻的操作方法

    VLC是一款開(kāi)源的多媒體播放器,它支持大量的視頻和音頻格式,并且具有強(qiáng)大的腳本和編程接口,這篇文章主要介紹了使用VLC實(shí)現(xiàn)自動(dòng)播放視頻,需要的朋友可以參考下
    2024-03-03
  • Python生成隨機(jī)數(shù)組的方法小結(jié)

    Python生成隨機(jī)數(shù)組的方法小結(jié)

    這篇文章主要介紹了Python生成隨機(jī)數(shù)組的方法,結(jié)合實(shí)例形式總結(jié)分析了Python使用random模塊生成隨機(jī)數(shù)與數(shù)組操作相關(guān)技巧,需要的朋友可以參考下
    2017-04-04
  • Python實(shí)現(xiàn)FM算法解析

    Python實(shí)現(xiàn)FM算法解析

    這篇文章主要介紹了Python實(shí)現(xiàn)FM算法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Python實(shí)現(xiàn)單例模式的幾種常見(jiàn)方式

    Python實(shí)現(xiàn)單例模式的幾種常見(jiàn)方式

    本文分享 Python 單例模式四種實(shí)現(xiàn)方式(裝飾器、new、函數(shù)、lru_cache),對(duì)比優(yōu)缺點(diǎn)后建議優(yōu)先顯式獲取單例,強(qiáng)調(diào)編程應(yīng)回歸樸素,避免過(guò)度設(shè)計(jì),簡(jiǎn)單直白的代碼更易維護(hù),需要的朋友可以參考下
    2026-05-05
  • Python selenium爬蟲(chóng)實(shí)現(xiàn)定時(shí)任務(wù)過(guò)程解析

    Python selenium爬蟲(chóng)實(shí)現(xiàn)定時(shí)任務(wù)過(guò)程解析

    這篇文章主要介紹了Python selenium爬蟲(chóng)實(shí)現(xiàn)定時(shí)任務(wù)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Python統(tǒng)計(jì)列表中每個(gè)元素出現(xiàn)次數(shù)的4種實(shí)現(xiàn)

    Python統(tǒng)計(jì)列表中每個(gè)元素出現(xiàn)次數(shù)的4種實(shí)現(xiàn)

    本文主要介紹了Python統(tǒng)計(jì)列表中每個(gè)元素出現(xiàn)次數(shù)的4種實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Pyhacker實(shí)現(xiàn)端口掃描器

    Pyhacker實(shí)現(xiàn)端口掃描器

    這篇文章主要為大家介紹了Pyhacker實(shí)現(xiàn)端口掃描器的過(guò)程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 重溫Python基礎(chǔ)之列表操作

    重溫Python基礎(chǔ)之列表操作

    這篇文章主要帶大家來(lái)復(fù)習(xí)一下Python基礎(chǔ)中的列表操作,不知道各位還記得多少呢?文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下
    2022-11-11
  • Python?pygame派生精靈和精靈組創(chuàng)建敵機(jī)

    Python?pygame派生精靈和精靈組創(chuàng)建敵機(jī)

    這篇文章主要為大家介紹了Python?pygame派生精靈和精靈組創(chuàng)建敵機(jī)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Python如何實(shí)現(xiàn)網(wǎng)絡(luò)自動(dòng)化運(yùn)維華為設(shè)備

    Python如何實(shí)現(xiàn)網(wǎng)絡(luò)自動(dòng)化運(yùn)維華為設(shè)備

    本文介紹了如何使用Python實(shí)現(xiàn)華為設(shè)備的網(wǎng)絡(luò)自動(dòng)化運(yùn)維,包括環(huán)境配置、設(shè)備配置、功能模塊實(shí)現(xiàn)和SFTP文件傳輸測(cè)試
    2024-11-11

最新評(píng)論

曲沃县| 永川市| 古浪县| 丽水市| 文登市| 太谷县| 长武县| 尼勒克县| 南江县| 隆安县| 祁门县| 淮北市| 天门市| 和政县| 阳春市| 常山县| 长垣县| 北京市| 东台市| 扶余县| 榆中县| 阳高县| 太和县| 常州市| 瑞昌市| 荔浦县| 得荣县| 彭州市| 莱芜市| 黑山县| 金门县| 阿合奇县| 武冈市| 泗水县| 洛阳市| 阳东县| 霍山县| 轮台县| 汝城县| 枣阳市| 肥城市|