Python 數據清洗教科書:40 個 Pandas 技巧解決 90% 的臟數據
從數據清洗到特征工程,從探索性分析(EDA)到復雜的數據透視,Pandas 提供了近乎完美的解決方案。 本文從實戰角度出發,將40個最常用的高頻方法劃分為 IO 操作、數據預覽、數據清洗、篩選索引、高級變換、統計聚合、數據合并、時間序列 八大核心模塊,帶你構建完整的數據處理知識體系。

一、 IO 操作:數據的輸入與輸出
這是數據處理的起點與終點。除了 CSV,掌握二進制格式(如 Parquet)能顯著提升大數據量的讀寫效率。
1. pd.read_csv() / pd.read_parquet()
用途:讀取數據。read_csv 是標配,但對于GB級別以上的數據,強烈推薦使用 read_parquet,體積更小,速度快 10 倍以上。
技巧:使用 chunksize 參數分塊讀取超大文件。
2. df.to_csv() / df.to_excel()
用途:數據落地。
技巧:設置 index=False 避免保存無意義的索引列;使用 float_format='%.2f' 控制浮點精度。
3. df.to_pickle()
用途:序列化保存。完美保留 DataFrame 的數據類型(如 Categorical),讀取速度極快,適合作為中間存儲格式。
4. pd.DataFrame.from_dict()
用途:從字典構建 DataFrame。
場景:爬蟲數據入庫或 API 響應數據解析時非常常用。
二、 數據預覽
在進行任何復雜操作前,必須先了解數據的全貌。
5. df.head() / df.tail()
用途:查看頭尾數據。不要只看前 5 行,偶爾看看 tail 能發現文件末尾的異常(如匯總行)。
6. df.info()
用途:查看內存占用、非空計數和字段類型。這是檢查 NaN 值和數據類型轉換的第一步。
7. df.describe()
用途:快速統計描述。
技巧:使用 include='all' 或 include=['O'] 來查看分類變量的統計信息(如唯一值數量)。
8. df.shape
用途:返回元組 (rows, columns),快速確認數據維度。
9. df.dtypes
用途:檢查每一列的數據類型。
10. df.value_counts()
用途:分類統計。
技巧:配合 normalize=True 直接查看占比,配合 dropna=False 查看缺失值的分布。
三、 數據清洗
現實世界的數據往往是“臟”的,這部分函數是數據工程師使用最高頻的工具。
11. df.dropna()
用途:刪除缺失值。
參數:thresh=n 可以保留至少有 n 個非空值的行,比單純的 how='any' 更靈活。
12. df.fillna()
用途:填充缺失值。
技巧:除了填充固定值,還可以使用 method='ffill'(前向填充)處理時間序列數據。
13. df.drop_duplicates()
用途:去重。
參數:subset=['col1', 'col2'] 可指定根據特定列去重,keep='last' 保留最新記錄。
14. df.astype()
用途:強制類型轉換。
技巧:將高基數的字符串列轉換為 'category' 類型,可節省高達 90% 的內存。
15. df.rename()
用途:重命名列名或索引。
代碼:df.rename(columns={'old_name': 'new_name'}, inplace=True)。
16. df.replace()
用途:值替換。支持字典映射替換,比 apply 更快。
四、 篩選與索引:精準定位
Pandas 的核心靈魂在于其強大的索引系統。
17. df.loc[]
用途:基于標簽(Label)的索引。
場景:df.loc[df['age'] > 25, ['name', 'salary']]。
18. df.iloc[]
用途:基于位置(Integer)的索引。
場景:df.iloc[:10, :3] 切片前10行、前3列。
19. df.query()
用途:SQL 風格的字符串查詢。
優勢:當篩選條件非常復雜時,query 語法比布爾索引更易讀。
代碼:df.query("age > 25 and department == 'Sales'")。
20. df.isin()
用途:判斷值是否存在于列表中,常用于多值篩選。
21. df.filter()
用途:根據列名或索引名篩選。
參數:支持 regex 正則表達式匹配列名,非常強大。
五、 高級變換與特征工程
這是區分新手與專家的分水嶺。
22. df.apply()
用途:沿軸應用函數。
注意:apply 循環效率較低,如果邏輯簡單,優先使用 Pandas 內置的向量化函數。
23. df.map()
用途:Series 專用的映射方法,常用于數據字典編碼轉換。
24. df.sort_values()
用途:排序。
參數:ascending=[True, False] 可對多列進行不同方向的排序。
25. df.set_index() / df.reset_index()
用途:索引管理。在 TimeSeries 分析中,通常將時間列 Set 為 Index。
26. df.drop()
用途:刪除行或列。需指定 axis=1 刪除列。
27. pd.cut() / pd.qcut()
用途:分箱(Binning)。
區別:cut 按數值間隔切分(等寬),qcut 按分位數切分(等頻)。
28. str 訪問器
用途:處理字符串列。
常用:df['col'].str.contains(), df['col'].str.split(), df['col'].str.replace()。
六、 統計與聚合
將數據從“明細表”變為“匯總表”。
29. df.groupby()
用途:分組。Pandas 的核心功能,遵循 Split-Apply-Combine 模式。
30. df.agg()
用途:聚合。
技巧:可以對不同列應用不同的聚合函數:df.groupby('dept').agg({'salary': 'mean', 'age': 'max'})。
31. pd.pivot_table()
用途:數據透視表。Excel 透視表的 Python 復刻版,支持多級索引匯總。
32. pd.crosstab()
用途:交叉表。計算分組頻率(頻數統計)時的快捷方式。
33. df.nlargest() / df.nsmallest()
用途:快速找出最大/最小的 Top N 記錄,比先 sort 再 head 效率更高。
七、 數據合并
處理多表關聯時的必備技能。
34. pd.merge()
用途:基于鍵(Key)的連接,類似于 SQL 的 JOIN。
參數:how='left'/'inner'/'outer', on='key'。
35. pd.concat()
用途:物理拼接。通常用于將結構相同的多個 DataFrame 上下(軸0)堆疊。
36. df.join()
用途:基于索引(Index)的快速合并。
八、 時間序列:Pandas 的看家本領
Pandas 最初就是為金融數據分析設計的,因此時間處理能力極強。
37. pd.to_datetime()
用途:智能轉換為時間類型。解析失敗時可使用 errors='coerce' 設為 NaT。
38. df.resample()
用途:重采樣。
場景:將“分鐘級”數據降采樣為“日級”數據(如 rule='1D'),并配合 .mean() 或 .sum() 使用。
39. df.shift()
用途:數據位移。
場景:計算同比、環比(即當前行減去上一行的數據)。
40. df.rolling()
用途:移動窗口。
場景:計算 5 日移動平均線(MA5):df['price'].rolling(window=5).mean()。
九、結語
掌握這 40 個方法,意味著你已經覆蓋了 90% 的日常數據處理需求。Pandas 的強大不僅在于函數數量,更在于其向量化運算的設計哲學。
在實際開發中,建議時刻關注內存使用與運行效率,盡量避免在 DataFrame 中使用 Python 原生的 for 循環,轉而使用上述內置的高效方法。





























