使用Python自動化處理Excel的臟數(shù)據(jù)
Excel臟數(shù)據(jù)“坑”死人!重復、缺失、格式不一,數(shù)據(jù)分析全跑偏!
在日常工作中,Excel表格是我們的好伙伴,但你有沒有被“臟數(shù)據(jù)”坑過?
多個人工錄入,導致姓名、電話號碼重復好幾行。
數(shù)據(jù)來源不一,部分單元格缺失了關鍵信息。
“蘋果”、“apple”、“Apple”……同一個商品名稱,格式不統(tǒng)一。
年齡寫成了“200歲”,銷售額填成了負數(shù),這些異常值讓平均數(shù)失去意義。
這些“臟數(shù)據(jù)”就像報表中的“地雷”,輕則讓你多加班幾小時核對,重則導致分析結果全跑偏,決策失誤!

今天,我將帶你深入Python數(shù)據(jù)清洗的奇妙世界!我們將手把手教你如何利用數(shù)據(jù)處理的“瑞士軍刀”——Pandas庫,輕松實現(xiàn):
數(shù)據(jù)去重: 一鍵移除重復數(shù)據(jù),讓表格清爽。
缺失值處理: 智能填充或刪除“空白”,讓數(shù)據(jù)完整。
格式統(tǒng)一: 規(guī)范字符串、轉換數(shù)據(jù)類型,讓數(shù)據(jù)“服服帖帖”。
異常值識別: 揪出數(shù)據(jù)中的“搗亂分子”。
最終,讓你的數(shù)據(jù)分析從此變得精準可靠!
1.數(shù)據(jù)清洗第一步:Python自動化處理重復值
在Python數(shù)據(jù)清洗中,處理重復值是提高數(shù)據(jù)質量的第一個關鍵步驟。重復數(shù)據(jù)不僅會占用存儲空間,更重要的是會導致統(tǒng)計結果偏差,讓你的報表分析全跑偏!
1.1 什么是重復值?為什么需要去重?
場景: 你有一份客戶名單,由于多次導入,同一個客戶的信息出現(xiàn)了好幾次?;蛘咪N售記錄中,同一筆訂單被意外記錄了兩次。
重復值是指在數(shù)據(jù)集中,某一行或某些列的數(shù)據(jù)與另一行(或多行)完全相同。它可能由以下原因造成:
人工錄入失誤: 重復輸入同一條數(shù)據(jù)。
多源數(shù)據(jù)合并: 從不同系統(tǒng)導入數(shù)據(jù)時,沒有進行去重處理。
系統(tǒng)故障: 導入流程中的錯誤導致數(shù)據(jù)重復。
為什么必須去重?
影響統(tǒng)計結果: 如果客戶名單重復,活躍客戶數(shù)就會算錯;銷售訂單重復,總銷售額就會虛高。
降低數(shù)據(jù)質量: 影響后續(xù)的數(shù)據(jù)分析和決策的精準度。
浪費存儲資源: 簡單的數(shù)據(jù)冗余。
1.2 Pandas drop_duplicates():一鍵去重,讓數(shù)據(jù)清爽起來!
方案: Pandas庫提供了極其強大的drop_duplicates()方法,能讓你一鍵移除DataFrame中的重復行,這是實現(xiàn)Pandas數(shù)據(jù)清洗教程中不可或缺的利器!
代碼:
import pandas as pd
import os
def remove_duplicates_from_excel(file_path, output_path, subset_cols=None):
"""
從Excel文件中移除重復行。
這是Python數(shù)據(jù)清洗和數(shù)據(jù)去重的核心功能。
:param file_path: 源Excel文件路徑
:param output_path: 去重后Excel文件的輸出路徑
:param subset_cols: 可選,指定根據(jù)哪些列判斷重復。如果為None,則根據(jù)所有列判斷。
"""
if not os.path.exists(file_path): return print(f"? Excel文件不存在:{file_path}")
try:
df = pd.read_excel(file_path)
original_rows = len(df)
print(f"?? 正在處理文件 '{os.path.basename(file_path)}',原始行數(shù): {original_rows}")
if subset_cols:
# 根據(jù)指定列去重
df_cleaned = df.drop_duplicates(subset=subset_cols, keep='first') # keep='first'保留第一次出現(xiàn)的重復項
print(f" ?? 根據(jù)列 {subset_cols} 去重。")
else:
# 根據(jù)所有列去重
df_cleaned = df.drop_duplicates(keep='first')
print(" ?? 根據(jù)所有列去重。")
cleaned_rows = len(df_cleaned)
removed_count = original_rows - cleaned_rows
os.makedirs(os.path.dirname(output_path), exist_ok=True)
df_cleaned.to_excel(output_path, index=False)
print(f"? 去重成功!已移除 {removed_count} 條重復數(shù)據(jù)。")
print(f" 去重后數(shù)據(jù)已保存到:'{os.path.basename(output_path)}' (行數(shù): {cleaned_rows})")
print("\n --- 去重后數(shù)據(jù)頭部 ---")
print(df_cleaned.head())
except Exception as e:
print(f"? 去重失?。簕e}")
if __name__ == "__main__":
# 準備測試Excel文件,包含重復行
# 例如:
# ID | Name | Phone
# -- | ---- | -----
# 1 | Alice| 111
# 2 | Bob | 222
# 1 | Alice| 111 <-- 重復行
# 3 | Carol| 333
# 2 | Bob | 444 <-- Phone不同,如果按ID+Name去重,則不算重復
test_excel_path = os.path.expanduser("~/Desktop/customer_data_duplicates.xlsx")
output_cleaned_path = os.path.expanduser("~/Desktop/customer_data_cleaned.xlsx")
# 簡單創(chuàng)建測試文件(包含重復)
pd.DataFrame({'ID': [1, 2, 1, 3, 2],
'Name': ['Alice', 'Bob', 'Alice', 'Carol', 'Bob'],
'Phone': ['111', '222', '111', '333', '444']}).to_excel(test_excel_path, index=False)
print("--- 示例1:根據(jù)所有列去重 ---")
remove_duplicates_from_excel(test_excel_path, output_cleaned_path)
print("\n--- 示例2:根據(jù) 'ID' 和 'Name' 列去重 ---")
remove_duplicates_from_excel(test_excel_path, os.path.expanduser("~/Desktop/customer_data_id_name_cleaned.xlsx"), subset_cols=['ID', 'Name'])
步驟:
準備Excel文件: 在桌面創(chuàng)建一個名為customer_data_duplicates.xlsx的Excel文件,并在其中輸入一些包含重復行的數(shù)據(jù)(可參照示例代碼)。
修改代碼路徑和去重列: 修改 test_excel_path、output_cleaned_path 和 subset_cols(如果需要)。
運行: 在VS Code終端運行 python remove_duplicates.py。
展示:

2.缺失值處理:Python智能填充,讓數(shù)據(jù)完整無缺
場景: Excel表格中有很多“空白”單元格(缺失值),它們可能是數(shù)據(jù)錄入時遺漏的,也可能是數(shù)據(jù)導出時出現(xiàn)的問題。這些缺失值會導致公式報錯、分析結果不準確。
缺失值是數(shù)據(jù)質量的又一殺手。Python的Pandas庫提供了靈活的缺失值處理策略,讓你選擇智能填充或刪除,確保數(shù)據(jù)完整無缺。
實現(xiàn):Pandas將缺失值統(tǒng)一表示為NaN(Not a Number),然后提供一系列方法來識別、填充或刪除它們。
2.1 識別缺失值:isnull()/isna(),空白全部識別
在處理缺失值之前,我們首先要知道哪些地方有缺失值。
代碼:
import pandas as pd
import os
def identify_missing_values(file_path):
"""
識別Excel文件中的缺失值,并顯示其分布。
這是缺失值處理的第一步。
:param file_path: Excel文件路徑
"""
if not os.path.exists(file_path): return print(f"? Excel文件不存在:{file_path}")
try:
df = pd.read_excel(file_path)
print(f"?? 正在識別文件 '{os.path.basename(file_path)}' 中的缺失值...")
# 核心操作:isnull() 返回一個布爾型DataFrame,每個True表示一個缺失值
missing_data = df.isnull()
print("\n --- 缺失值布爾型視圖(True表示缺失)---")
print(missing_data.head())
# 統(tǒng)計每列的缺失值數(shù)量
missing_counts = df.isnull().sum()
print("\n --- 每列缺失值數(shù)量 ---")
print(missing_counts)
# 統(tǒng)計總缺失值數(shù)量
total_missing = df.isnull().sum().sum()
print(f"\n 總缺失值數(shù)量: {total_missing}")
# 可選:顯示缺失值比例
missing_percentage = df.isnull().sum() * 100 / len(df)
print("\n --- 每列缺失值比例 (%) ---")
print(missing_percentage)
except Exception as e:
print(f"? 識別缺失值失敗:{e}")
if __name__ == "__main__":
# 準備測試Excel文件,包含一些缺失值 (空單元格或#N/A)
# 例如:
# Name | Age | City
# ---- | --- | ----
# Alice| 25 | NY
# Bob | NaN | LA <-- 缺失
# Carol| 30 | <-- 缺失
test_excel_path = os.path.expanduser("~/Desktop/data_with_missing.xlsx")
pd.DataFrame({'Name': ['Alice', 'Bob', 'Carol', 'David'],
'Age': [25, None, 30, 40],
'City': ['NY', 'LA', None, 'SF']}).to_excel(test_excel_path, index=False)
identify_missing_values(test_excel_path)
步驟:
準備Excel文件: 在桌面創(chuàng)建data_with_missing.xlsx,并在其中輸入一些包含空單元格的數(shù)據(jù)。
修改代碼路徑: 修改 test_excel_path。
運行: 運行 python identify_missing.py。
展示:

2.2 填充缺失值:fillna(),智能補齊數(shù)據(jù)空白
場景: 你希望用某種合理的值來替代缺失的數(shù)據(jù),而不是直接刪除整行,以保留盡可能多的信息。比如用平均值填充年齡,或用“未知”填充空字符串。
方案: df.fillna()方法提供了多種智能填充策略,讓你根據(jù)數(shù)據(jù)特性選擇最合適的填充方式。
代碼:
import pandas as pd
import os
def fill_missing_values(file_path, output_path, fill_strategy="mean"):
"""
填充Excel文件中的缺失值。
這是Python數(shù)據(jù)清洗和缺失值處理的核心功能,實現(xiàn)數(shù)據(jù)完整無缺。
:param file_path: 源Excel文件路徑
:param output_path: 填充后Excel文件的輸出路徑
:param fill_strategy: 填充策略 ("mean", "median", "mode", "ffill", "bfill", "constant")
"""
if not os.path.exists(file_path): return print(f"? Excel文件不存在:{file_path}")
try:
df = pd.read_excel(file_path)
print(f"?? 正在使用 '{fill_strategy}' 策略填充 '{os.path.basename(file_path)}' 中的缺失值...")
df_filled = df.copy() # 操作副本,不改變原DataFrame
if fill_strategy == "mean":
df_filled = df_filled.fillna(df_filled.mean(numeric_only=True)) # 填充數(shù)值列的均值
elif fill_strategy == "median":
df_filled = df_filled.fillna(df_filled.median(numeric_only=True)) # 填充數(shù)值列的中位數(shù)
elif fill_strategy == "mode":
# 眾數(shù)可能不止一個,這里取第一個
for col in df_filled.columns:
if df_filled[col].isnull().any():
mode_val = df_filled[col].mode()[0] if not df_filled[col].mode().empty else None
df_filled[col] = df_filled[col].fillna(mode_val)
elif fill_strategy == "ffill": # forward fill,用前一個非缺失值填充
df_filled = df_filled.fillna(method='ffill')
elif fill_strategy == "bfill": # backward fill,用后一個非缺失值填充
df_filled = df_filled.fillna(method='bfill')
elif fill_strategy == "constant": # 用固定值填充
# 針對不同數(shù)據(jù)類型可以設置不同常數(shù),這里簡化
df_filled = df_filled.fillna("未知") # 填充字符串為“未知”
df_filled = df_filled.fillna(0, numeric_only=True) # 填充數(shù)字為0
else:
print("?? 未知填充策略。")
os.makedirs(os.path.dirname(output_path), exist_ok=True)
df_filled.to_excel(output_path, index=False)
print(f"? 缺失值填充成功!結果保存到:'{os.path.basename(output_path)}'")
print("\n --- 填充后數(shù)據(jù)頭部 ---")
print(df_filled.head())
except Exception as e:
print(f"? 填充缺失值失?。簕e}")
if __name__ == "__main__":
test_excel_path = os.path.expanduser("~/Desktop/data_with_missing.xlsx") # 使用2.1節(jié)創(chuàng)建的文件
output_filled_path_mean = os.path.expanduser("~/Desktop/data_filled_mean.xlsx")
output_filled_path_constant = os.path.expanduser("~/Desktop/data_filled_unknown.xlsx")
# 示例1:用均值填充數(shù)值缺失值
fill_missing_values(test_excel_path, output_filled_path_mean, fill_strategy="mean")
# 示例2:用常數(shù)“未知”填充字符串缺失值
# fill_missing_values(test_excel_path, output_filled_path_constant, fill_strategy="constant")
步驟:
準備Excel文件: 使用2.1節(jié)創(chuàng)建的data_with_missing.xlsx文件。
修改代碼路徑和填充策略: 修改 test_excel_path、output_filled_path_mean 和 fill_strategy。
運行: 運行 python fill_missing.py。
展示:

2.3 刪除缺失值:dropna(),保證數(shù)據(jù)完整性
場景: 有些數(shù)據(jù)行的缺失值太多,或者在關鍵列有缺失,導致整行數(shù)據(jù)價值不大,直接刪除是更有效的處理方式。
方案: df.dropna()方法能根據(jù)你的需求,一鍵刪除包含缺失值的行或列,確保你分析的數(shù)據(jù)集是完全完整無缺的。
代碼:
import pandas as pd
import os
def drop_missing_values(file_path, output_path, how_to_drop="any", subset_cols=None):
"""
刪除Excel文件中包含缺失值的行或列。
這是Python數(shù)據(jù)清洗和缺失值處理的關鍵功能。
:param file_path: 源Excel文件路徑
:param output_path: 刪除后Excel文件的輸出路徑
:param how_to_drop: 刪除策略 ("any" - 只要有缺失就刪除, "all" - 整行/列都是缺失才刪除)
:param subset_cols: 可選,指定只檢查這些列的缺失值
"""
if not os.path.exists(file_path): return print(f"? Excel文件不存在:{file_path}")
try:
df = pd.read_excel(file_path)
original_rows = len(df)
print(f"?? 正在刪除 '{os.path.basename(file_path)}' 中的缺失值,原始行數(shù): {original_rows}")
# **核心操作:df.dropna()**
# how="any" 表示只要有任一缺失值就刪除該行/列
# how="all" 表示只有當所有值為缺失值時才刪除該行/列
# axis=0 (默認) 表示刪除行,axis=1 表示刪除列
df_dropped = df.dropna(how=how_to_drop, subset=subset_cols)
dropped_rows = original_rows - len(df_dropped)
os.makedirs(os.path.dirname(output_path), exist_ok=True)
df_dropped.to_excel(output_path, index=False)
print(f"? 缺失值刪除成功!已刪除 {dropped_rows} 條數(shù)據(jù)。")
print(f" 刪除后數(shù)據(jù)已保存到:'{os.path.basename(output_path)}' (行數(shù): {len(df_dropped)})")
print("\n --- 刪除后數(shù)據(jù)頭部 ---")
print(df_dropped.head())
except Exception as e:
print(f"? 刪除缺失值失?。簕e}")
if __name__ == "__main__":
test_excel_path = os.path.expanduser("~/Desktop/data_with_missing.xlsx") # 使用2.1節(jié)創(chuàng)建的文件
output_dropped_any = os.path.expanduser("~/Desktop/data_dropped_any.xlsx")
output_dropped_subset = os.path.expanduser("~/Desktop/data_dropped_subset.xlsx")
# 示例1:刪除任何包含缺失值的行
print("\n--- 示例1:刪除任何包含缺失值的行 ---")
drop_missing_values(test_excel_path, output_dropped_any, how_to_drop="any")
# 示例2:只刪除 'Age' 列有缺失值的行
print("\n--- 示例2:只刪除 'Age' 列有缺失值的行 ---")
drop_missing_values(test_excel_path, output_dropped_subset, how_to_drop="any", subset_cols=['Age'])
步驟:
準備Excel文件: 使用2.1節(jié)創(chuàng)建的data_with_missing.xlsx文件。
修改代碼路徑和刪除策略: 修改 test_excel_path、output_dropped_any 等,并調整 how_to_drop 和 subset_cols。
運行: 運行 python drop_missing.py。
展示:

3.格式統(tǒng)一與異常值處理:Python讓你的數(shù)據(jù)規(guī)范化
場景: Excel表格中,姓名大小寫不一,“手機號”被存成了文本格式,日期混亂。還有一些明顯錯誤的“搗亂分子”(如年齡200歲),這些都讓你的Excel臟數(shù)據(jù)分析困難。
方案: Pandas能幫你自動化處理Excel臟數(shù)據(jù)中的格式不統(tǒng)一問題,并對異常值進行簡單識別和過濾,讓你的數(shù)據(jù)質量達到新高度。
作用: Pandas提供強大的字符串操作、類型轉換和統(tǒng)計方法,用于數(shù)據(jù)的精細化管理。
3.1 字符串格式統(tǒng)一:大小寫、空格、特殊字符,一鍵規(guī)范化
場景: “APPLE”、“apple”、“ Apple”……同一個商品名稱,大小寫、空格不一致,導致統(tǒng)計時被認為是不同的商品。
方案: Pandas對字符串操作非常靈活,可以輕松實現(xiàn)大小寫轉換、去除多余空格、清理特殊字符等
代碼:
import pandas as pd
import os
def normalize_strings_in_excel(file_path, output_path, column_name="Product"):
"""
統(tǒng)一Excel指定列的字符串格式(大小寫,去除空格)。
這是Python數(shù)據(jù)清洗和Excel數(shù)據(jù)處理自動化的常見操作。
:param file_path: 源Excel文件路徑
:param output_path: 統(tǒng)一格式后Excel文件的輸出路徑
:param column_name: 要處理的字符串列名
"""
if not os.path.exists(file_path): return print(f"? Excel文件不存在:{file_path}")
try:
df = pd.read_excel(file_path)
print(f"?? 正在統(tǒng)一列 '{column_name}' 的字符串格式...")
# 確保列是字符串類型,然后進行操作
if pd.api.types.is_string_dtype(df[column_name]):
# 核心操作:轉換為小寫,去除首尾空格
df[column_name] = df[column_name].str.lower().str.strip()
print(" ? 已將字符串轉換為小寫并去除首尾空格。")
else:
print(f"?? 列 '{column_name}' 不是字符串類型,跳過格式統(tǒng)一。")
os.makedirs(os.path.dirname(output_path), exist_ok=True)
df.to_excel(output_path, index=False)
print(f"? 字符串格式統(tǒng)一成功!結果保存到:'{os.path.basename(output_path)}'")
print("\n --- 統(tǒng)一格式后數(shù)據(jù)頭部 ---")
print(df.head())
except Exception as e:
print(f"? 字符串格式統(tǒng)一失敗:{e}")
if __name__ == "__main__":
test_excel_path = os.path.expanduser("~/Desktop/product_names.xlsx")
output_cleaned_path = os.path.expanduser("~/Desktop/product_names_cleaned.xlsx")
pd.DataFrame({'Product': [' APPLE ', 'Banana', 'ORANGE ', ' apple'], 'Price': [10, 5, 8, 12]}).to_excel(test_excel_path, index=False)
normalize_strings_in_excel(test_excel_path, output_cleaned_path, column_name="Product")
步驟:
準備Excel文件: 在桌面創(chuàng)建product_names.xlsx,包含一些大小寫、空格不一致的文本數(shù)據(jù)。
修改代碼路徑和列名: 修改 test_excel_path、output_cleaned_path 和 column_name。
運行: 運行 python normalize_strings.py。
展示:

3.2 數(shù)據(jù)類型轉換:文本變數(shù)字、日期格式化,讓數(shù)據(jù)自動計算
場景: 從不同系統(tǒng)導出的Excel文件,數(shù)字(如銷售額)被識別為文本,日期格式五花八門。這導致你無法進行計算、排序或篩選。
方案: Pandas可以強制轉換列的數(shù)據(jù)類型,確保數(shù)字就是數(shù)字,日期就是日期,便于后續(xù)數(shù)據(jù)分析**。
代碼:
import pandas as pd
import os
def convert_data_types_in_excel(file_path, output_path):
"""
轉換Excel文件中指定列的數(shù)據(jù)類型。
這是Python數(shù)據(jù)清洗和Excel數(shù)據(jù)處理自動化的核心。
:param file_path: 源Excel文件路徑
:param output_path: 轉換后Excel文件的輸出路徑
"""
if not os.path.exists(file_path): return print(f"? Excel文件不存在:{file_path}")
try:
df = pd.read_excel(file_path)
print(f"?? 正在轉換 '{os.path.basename(file_path)}' 中的數(shù)據(jù)類型...")
print("\n --- 原始數(shù)據(jù)類型 ---")
print(df.dtypes)
# **核心操作1:文本列轉為數(shù)值**
# errors='coerce' 會將無法轉換的值變?yōu)镹aN,而不是報錯
df['Sales_Amount'] = pd.to_numeric(df['Sales_Amount'], errors='coerce')
# **核心操作2:統(tǒng)一日期格式**
df['Order_Date'] = pd.to_datetime(df['Order_Date'], errors='coerce')
# 如果需要特定日期字符串格式,可以再轉換一次:df['Order_Date'] = df['Order_Date'].dt.strftime('%Y-%m-%d')
print("\n --- 轉換后數(shù)據(jù)類型 ---")
print(df.dtypes)
os.makedirs(os.path.dirname(output_path), exist_ok=True)
df.to_excel(output_path, index=False)
print(f"? 數(shù)據(jù)類型轉換成功!結果保存到:'{os.path.basename(output_path)}'")
print("\n --- 轉換后數(shù)據(jù)頭部 ---")
print(df.head())
except Exception as e:
print(f"? 數(shù)據(jù)類型轉換失?。簕e}")
if __name__ == "__main__":
test_excel_path = os.path.expanduser("~/Desktop/mixed_data.xlsx")
output_cleaned_path = os.path.expanduser("~/Desktop/mixed_data_cleaned.xlsx")
# 簡單創(chuàng)建測試文件,包含字符串形式的數(shù)字和不同格式的日期
pd.DataFrame({'Sales_Amount': ['123', '456.78', 'N/A', '789'],
'Order_Date': ['2023-01-15', '1/2/23', 'March 10, 2023', None]}).to_excel(test_excel_path, index=False)
convert_data_types_in_excel(test_excel_path, output_cleaned_path)
步驟:
準備Excel文件: 在桌面創(chuàng)建mixed_data.xlsx,包含字符串形式的數(shù)字和日期。
修改代碼路徑: 修改 test_excel_path 和 output_cleaned_path。
運行: 運行 python convert_data_types.py。
展示:

3.3 異常值簡單處理:識別并過濾數(shù)據(jù)中的異常信息
場景: 數(shù)據(jù)集中出現(xiàn)明顯不合理的值,如年齡為200歲,或銷售額為負數(shù)。這些異常值會嚴重干擾統(tǒng)計分析結果。
方案: Pandas結合簡單的統(tǒng)計方法(如描述性統(tǒng)計、箱線圖)或基于業(yè)務規(guī)則的過濾,可以識別并過濾掉異常值,確保你的數(shù)據(jù)更可靠。
代碼:
import pandas as pd
import os
def handle_outliers_simple(file_path, output_path, column_name="Age", lower_bound=0, upper_bound=120):
"""
簡單處理Excel中指定列的異常值(過濾掉超出合理范圍的數(shù)據(jù))。
這是Python數(shù)據(jù)清洗和異常值處理的基礎。
:param file_path: 源Excel文件路徑
:param output_path: 處理后Excel文件的輸出路徑
:param column_name: 要檢查異常值的列名
:param lower_bound: 合理范圍的下限
:param upper_bound: 合理范圍的上限
"""
if not os.path.exists(file_path): return print(f"? Excel文件不存在:{file_path}")
try:
df = pd.read_excel(file_path)
original_rows = len(df)
print(f"?? 正在處理列 '{column_name}' 中的異常值,原始行數(shù): {original_rows}")
# 確保列是數(shù)值類型
df[column_name] = pd.to_numeric(df[column_name], errors='coerce')
df_cleaned = df.dropna(subset=[column_name]) # 先刪除無法轉換為數(shù)字的行
# **核心操作:基于閾值過濾異常值**
df_filtered = df_cleaned[(df_cleaned[column_name] >= lower_bound) & (df_cleaned[column_name] <= upper_bound)]
removed_outliers = original_rows - len(df_filtered)
os.makedirs(os.path.dirname(output_path), exist_ok=True)
df_filtered.to_excel(output_path, index=False)
print(f"? 異常值處理成功!已移除 {removed_outliers} 條異常數(shù)據(jù)。")
print(f" 處理后數(shù)據(jù)已保存到:'{os.path.basename(output_path)}' (行數(shù): {len(df_filtered)})")
print("\n --- 處理后數(shù)據(jù)頭部 ---")
print(df_filtered.head())
except Exception as e:
print(f"? 異常值處理失?。簕e}")
if __name__ == "__main__":
test_excel_path = os.path.expanduser("~/Desktop/data_with_outliers.xlsx")
output_cleaned_path = os.path.expanduser("~/Desktop/data_outliers_cleaned.xlsx")
pd.DataFrame({'Name': ['A', 'B', 'C', 'D'],
'Age': [25, 200, 30, -5], # 包含異常值
'Score': [90, 85, 95, 10]}).to_excel(test_excel_path, index=False)
handle_outliers_simple(test_excel_path, output_cleaned_path, column_name="Age", lower_bound=1, upper_bound=100)
步驟:
準備Excel文件: 在桌面創(chuàng)建data_with_outliers.xlsx,包含一些明顯錯誤的數(shù)值(如年齡200)。
修改代碼路徑和異常值范圍: 修改 test_excel_path、output_cleaned_path 和 lower_bound/upper_bound。
運行: 運行 python handle_outliers.py。
展示:

4 你的“Excel數(shù)據(jù)貼身護衛(wèi)”!
恭喜你!通過本篇文章,你已經(jīng)掌握了Python數(shù)據(jù)清洗的各項核心魔法,
我們深入學習了Pandas庫在Excel數(shù)據(jù)處理自動化中的應用,掌握了如何:
數(shù)據(jù)去重: 運用drop_duplicates(),一鍵移除重復數(shù)據(jù),確保統(tǒng)計準確性。
缺失值處理: 運用fillna()進行智能填充,或dropna()刪除缺失值,保證數(shù)據(jù)完整無缺。
格式統(tǒng)一: 對字符串進行大小寫轉換、去除空格,確保數(shù)據(jù)一致性。
數(shù)據(jù)類型轉換: 確保數(shù)據(jù)能正確計算和分析。
異常值處理: 簡單識別并過濾數(shù)據(jù)中的“搗亂分子”,讓決策更精準。
這個“數(shù)據(jù)貼身護衛(wèi)”,將是你在數(shù)據(jù)自動化處理道路上的又一個里程碑,為你后續(xù)的Python數(shù)據(jù)分析入門打下堅實基礎!
5.展望:數(shù)據(jù)清洗魔法,開啟高質量數(shù)據(jù)分析!
通過本篇文章,你已經(jīng)掌握了Python數(shù)據(jù)清洗的強大能力,為你的辦公自動化之旅又增添了一個重量級技能!你學會了如何利用Pandas這個Python實用工具,高效地處理Excel中的各種“臟數(shù)據(jù)”問題。
除了今天學到的功能,你還希望Python能幫你實現(xiàn)哪些Excel自動化操作?比如自動篩選數(shù)據(jù)并生成圖表?數(shù)據(jù)透 視表自動化?你會在哪些場景下使用這個“數(shù)據(jù)清潔工”?
以上就是使用Python自動化處理Excel的臟數(shù)據(jù)的詳細內容,更多關于Python處理Excel臟數(shù)據(jù)的資料請關注腳本之家其它相關文章!
相關文章
Python+Pillow+Pytesseract實現(xiàn)驗證碼識別
這篇文章主要為大家詳細介紹了如何利用pillow和pytesseract來實現(xiàn)驗證碼的識別,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2022-05-05
python協(xié)程之yield和yield?from實例詳解
Python在并發(fā)處理上不僅提供了多進程和多線程的處理,還包括了協(xié)程,下面這篇文章主要給大家介紹了關于python協(xié)程之yield和yield?from的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-12-12
Pandas探索之高性能函數(shù)eval和query解析
這篇文章主要介紹了Pandas探索之高性能函數(shù)eval和query解析,小編覺得還是挺不錯的,這里分享給大家,供需要的朋友參考。2017-10-10
pytorch 預訓練模型讀取修改相關參數(shù)的填坑問題
這篇文章主要介紹了pytorch 預訓練模型讀取修改相關參數(shù)的填坑問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
Python SMTP發(fā)送郵件遇到的一些問題及解決辦法
今天小編就為大家分享一篇關于Python SMTP發(fā)送郵件遇到的一些問題及解決辦法,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10

