據(jù)處理全攻略:從數(shù)據(jù)結(jié)構(gòu)到清洗實戰(zhàn))
但凡用Python做數(shù)據(jù)分析pandas是你繞不開的一個庫。我見過不少新手下載了一堆教程結(jié)果連數(shù)據(jù)結(jié)構(gòu)都沒搞明白就上手跑代碼最后被各種報錯勸退。也有朋友在頭歌Educoder平臺上做pandas作業(yè)題目看著簡單但提交評測就是過不了問我能不能一次性把pandas基礎講清楚。這篇文章我就以實際使用經(jīng)驗為主線把pandas從安裝、數(shù)據(jù)結(jié)構(gòu)創(chuàng)建、讀寫Excel和文本文件、數(shù)據(jù)類型轉(zhuǎn)換、正則表達式配合、數(shù)據(jù)清洗一直到ewm函數(shù)參數(shù)這些高頻考點全部串一遍。文中的代碼示例都是我平時工作里直接能用的寫法每個關(guān)鍵參數(shù)我都盡量解釋“為什么這么設”你照著敲一遍基本就能應付日常數(shù)據(jù)處理和頭歌上的基礎關(guān)卡了。適合剛學Python數(shù)據(jù)分析的初學者也適合那些用過pandas但遇到報錯還是一頭霧水的朋友。1. 環(huán)境準備與安裝別讓環(huán)境問題擋住第一步1.1 PyCharm里安裝pandas包的兩種方式先說安裝。很多人在PyCharm里裝pandas第一反應是打開File菜單去找Settings再逐個點開Project下的Python Interpreter點右上角的加號搜索pandas等它轉(zhuǎn)圈下載。這種方式本身沒錯但有一個問題下載源默認是官方PyPI在國內(nèi)網(wǎng)絡環(huán)境下經(jīng)常跑到一半就超時失敗。我的建議是先把pip的下載源換成國內(nèi)鏡像比如清華的源再來裝。第二種方式是直接在PyCharm底部的Terminal終端里執(zhí)行pip install pandas如果當前Python環(huán)境不是系統(tǒng)自帶的而是項目里單獨創(chuàng)建的虛擬環(huán)境要確認這個終端確實激活了對應的虛擬環(huán)境。判斷方法很簡單終端命令行的前面如果出現(xiàn)了項目名比如(venv) C:\Users\...這樣說明是在虛擬環(huán)境里如果看不到項目名只是C:\Users\...那很可能裝到全局Python里去了PyCharm的項目解釋器里還是找不到pandas。如果你是剛裝了Anaconda那pandas早就內(nèi)置了打開PyCharm新建項目時解釋器記得選conda環(huán)境而不是默認的Project Venv否則又會重復裝一遍。這里給一個檢查是否安裝成功的標準方法在終端或Python控制臺執(zhí)行import pandas as pd print(pd.__version__)能正常輸出版本號比如2.0.3就說明環(huán)境OK。沒輸出或直接報ModuleNotFoundError那就說明pandas沒裝對位置回到上面檢查解釋器。1.2 安裝后仍然報錯的常見原因有一種情況特別坑明明在PyCharm的設置里看到pandas已經(jīng)安裝成功但運行代碼還是提示找不到模塊。八成是因為PyCharm的項目解釋器和你使用pip安裝時的Python是兩套環(huán)境。PyCharm里點擊右下角的解釋器名稱彈出的列表里可以看到當前項目到底用的是哪一個Python解釋器然后在終端里執(zhí)行python -c import sys; print(sys.executable)看一下自己用的是哪一個。兩者一致才靠譜。還有兼容性問題需要注意。pandas對Python版本有要求如果你還在用古老的Python 3.6甚至Python 2.7市面上新版pandas2.x系列裝不上去。這種情況下pip會嘗試下載一個對應當前Python版本的舊版pandas而舊版pandas在部分功能上和新代碼有差異。遇到這種情況建議升級Python環(huán)境起碼3.9以上否則做數(shù)據(jù)清洗時部分新參數(shù)會不生效排查起來很費勁。2. 數(shù)據(jù)結(jié)構(gòu)創(chuàng)建先搞懂Series和DataFrame再動手2.1 Series是一列帶標簽的數(shù)據(jù)很多教程喜歡一上來就堆概念我換一種說法Series在pandas里本質(zhì)上就是帶有索引的一維數(shù)組可以把它理解成一張單列的Excel表格。創(chuàng)建Series最常用的方式是從列表創(chuàng)建import pandas as pd s pd.Series([10, 20, 30, 40]) print(s)輸出結(jié)果里左邊是索引默認0、1、2、3右邊是具體的值。如果你想讓索引有實際意義比如按日期排列可以顯式指定index參數(shù)s pd.Series([10, 20, 30, 40], index[周一, 周二, 周三, 周四])這里要注意一個細節(jié)index的長度必須和數(shù)據(jù)的長度一致否則會直接報ValueError: Length of values does not match length of index這是新手經(jīng)常觸發(fā)的錯誤。創(chuàng)建一個Series只需要記住它是一維的、帶索引的、可以存任意類型的數(shù)據(jù)。在頭歌的pandas數(shù)據(jù)結(jié)構(gòu)創(chuàng)建題里常見的考法就是用字典去創(chuàng)建Seriess pd.Series({蘋果: 5.5, 香蕉: 3.2, 橘子: 4.8})字典的key自動變成索引value變成數(shù)據(jù)這比自己手動指定index更方便推薦優(yōu)先使用。2.2 DataFrame是二維表格的核心DataFrame可以理解成Excel里的一個工作表有行索引也有列索引。日常處理數(shù)據(jù)時99%的操作都在DataFrame上。最常見的創(chuàng)建方式是從字典創(chuàng)建字典的key變成列名value一般是列表列表的長度必須一致df pd.DataFrame({ 姓名: [張三, 李四, 王五], 年齡: [25, 30, 22], 城市: [北京, 上海, 深圳] })還有幾個高頻創(chuàng)建方式需要掌握。第一種是從嵌套列表創(chuàng)建適合你手里是一行行數(shù)據(jù)的情況data [[張三, 25, 北京], [李四, 30, 上海], [王五, 22, 深圳]] df pd.DataFrame(data, columns[姓名, 年齡, 城市])第二種是從numpy數(shù)組創(chuàng)建適合用科學計算時把矩陣包裝成表格。第三種是從列表套字典的更復雜結(jié)構(gòu)中創(chuàng)建每條記錄一個字典columns會自動統(tǒng)一。創(chuàng)建一個dataframe時一定要想清楚你是以“列為主”還是“行為主”這決定了應該用字典套列表、列表套字典還是嵌套列表。為了方便起見我整理了一個Series和DataFrame的關(guān)鍵對比理解了這張表基礎題基本就穩(wěn)了數(shù)據(jù)結(jié)構(gòu)維度索引概念默認索引創(chuàng)建方式Series一維單一索引0到n-1pd.Series(列表或字典)DataFrame二維行索引列索引0到n-1pd.DataFrame(字典或列表嵌套)Index對象一維特化的索引數(shù)組無默認由DataFrame或Series自動生成3. 數(shù)據(jù)讀寫Excel和文本文件是日常主力3.1 讀取Excel文件的幾個關(guān)鍵參數(shù)pandas讀寫Excel文件是數(shù)據(jù)分析里最常碰到的場景之一畢竟業(yè)務側(cè)的數(shù)據(jù)多數(shù)以Excel表格歸檔。讀取函數(shù)pd.read_excel()有幾個參數(shù)你必須要熟練第一個是sheet_name比如一個工作簿里有多個Sheet需要按名稱讀取df pd.read_excel(銷售數(shù)據(jù).xlsx, sheet_name2024年7月)如果不指定sheet_name默認只會讀取第一個Sheet。sheet_name也可以傳入整數(shù)0表示第一個Sheet傳入列表還能一次讀取多個Sheet返回一個字典結(jié)構(gòu)不過新手期先掌握名稱讀取就夠了。第二個是header參數(shù)默認值為0表示把第一行當作列名。如果Excel表格上面有兩行大標題真正的表頭在第三行那就需要設置header2pandas會自動跳過上面兩行。反過來如果某個表格沒有表頭全是純數(shù)據(jù)就傳headerNone并用names[列1, 列2]手動指定列名否則pandas會用0、1、2這樣的數(shù)字當列名后續(xù)操作非常別扭。第三個高頻參數(shù)是usecols只讀取指定列以節(jié)省內(nèi)存比如usecols[姓名, 年齡]。寫出Excel文件的函數(shù)是to_excel()有一個參數(shù)官方默認True但實踐中建議一定要設成False就是index參數(shù)df.to_excel(輸出結(jié)果.xlsx, indexFalse)如果不設indexFalse輸出文件里會多出一列從0開始的行索引這在交付給同事或交給老師評測時經(jīng)常算錯誤格式。此外多Sheet寫出需要借助pd.ExcelWriter比如同時輸出兩個表格到同一個文件的不同Sheet里。3.2 文本文件讀取的核心參數(shù)這里說的文本文件主要指CSV和TSV這類用分隔符劃分列的文件。read_csv()是讀取函數(shù)需要注意的坑比Excel多一些。第一個坑是編碼問題。df pd.read_csv(訂單.csv, encodingutf-8)國內(nèi)Excel另存的CSV文件默認是GBK編碼直接用utf-8讀取會報UnicodeDecodeError解決辦法是把encoding參數(shù)改成gbk。這里我說一個經(jīng)驗值讀Excel生成的文件報編碼錯誤優(yōu)先試gbk讀程序生成的CSV優(yōu)先試utf-8兩種都不行再試gb18030這個編碼兼容性更強能覆蓋絕大多數(shù)中文場景。第二個坑是分隔符。默認情況下read_csv默認分隔符是逗號如果遇到制表符分隔的TSV文件就要指定sep\t。有些特殊文件用的是分號或豎線分隔同樣要用sep去匹配。第三個坑是skiprows和nrows。skiprows可以跳過文件前面若干行注釋或無效信息nrows則限制只讀取前N行適合在大文件上先快速預覽df_preview pd.read_csv(超大文件.csv, nrows100) # 先讀前100行看結(jié)構(gòu)寫出文本文件時有一個比Excel更容易踩的坑直接用to_csv(結(jié)果.csv)然后拿Excel打開這個文件中文全部變成亂碼。這是因為默認編碼是utf-8Excel默認不認。解決辦法很簡單df.to_csv(結(jié)果.csv, indexFalse, encodingutf-8-sig)utf-8-sig編碼會在文件開頭加入一個BOM標記Excel讀取時就能正確識別是utf-8編碼。這個小細節(jié)頭歌作業(yè)評測里也經(jīng)常用到輸出格式不規(guī)范會導致判題失敗。4. 數(shù)據(jù)類型轉(zhuǎn)換與正則表達式預處理的兩把利器4.1 用dtypes定位類型問題和astype轉(zhuǎn)換pandas每一列都有數(shù)據(jù)類型常見的有int64、float64、object字符串為主、datetime64[ns]。查看所有列類型用df.dtypes屬性查看單列用df[列名].dtype。數(shù)據(jù)處理中最常見的類型問題是讀進來的數(shù)字列變成了object類型。例如Excel里某列有個別單元格是“-”或者“N/A”pandas就會把整列推斷成字符串后續(xù)做數(shù)值計算直接報錯。遇到這種情況我慣用的方法是pd.to_numeric配合errors參數(shù)df[金額] pd.to_numeric(df[金額], errorscoerce)errorscoerce會把無法轉(zhuǎn)換的內(nèi)容強制變成NaN能轉(zhuǎn)的數(shù)字保留下來。這一步處理完后再去看那列到底有哪些非數(shù)字內(nèi)容用df[金額].isna()去定位。直接使用astype(int)在這種場景下往往直接拋異常因為它在轉(zhuǎn)換時遇到非法值不會跳過所以我不建議對臟數(shù)據(jù)使用astype做類型轉(zhuǎn)換。但是如果手頭的數(shù)據(jù)是干凈的期望把浮點列轉(zhuǎn)成整數(shù)列astype就非常好用df[銷量] df[銷量].astype(int)這里順帶提一個常見坑某列明明顯示的是日期形式但用astype轉(zhuǎn)成日期類型會報錯。正確做法是用pd.to_datetime()df[下單時間] pd.to_datetime(df[下單時間], format%Y-%m-%d)format參數(shù)加上最穩(wěn)雖然pandas會自動推斷但遇到混合格式時會識別出錯。日期格式字符串里%Y是四位年份%m是兩位月份%d是兩位日這些可以對照文檔查閱mac和Windows環(huán)境下表現(xiàn)一致。4.2 正則表達式在pandas中的應用技巧熱搜詞里有人把“正則表達式”誤打成了“正在表達式”心想既然是高頻搜索詞那應該不少人在pandas里用正則時遇到困難。正則表達式在pandas里的應用核心是配合str訪問器完成三類操作。第一類是篩選匹配模式的行用str.contains()加上正則# 篩選出所有包含手機號聯(lián)系人 df_mobile df[df[聯(lián)系方式].str.contains(r^1[3-9]\d{9}$, naFalse)]naFalse的作用是把缺失值當作不匹配來處理否則遇到NaN會直接報錯。第二類是提取關(guān)鍵信息用str.extract()把字符串里的部分內(nèi)容提取為新列# 從訂單號中提取兩位的年份信息 df[年份] df[訂單號].str.extract(r(\d{4}))圓括號部分就是想提取的組。第三類是批量替換用str.replace()注意默認情況下它會按正則去匹配而不是普通的字符串替換所以如果只是想替換逗號這類普通字符最好把正則表達式寫成r,而不是裸逗號避免歧義。df[金額] df[金額].str.replace(r[,], , regexTrue)這條命令可以把千分位分隔符和中文逗號一次性清掉是清洗金額字段的好幫手。正則這塊我強調(diào)一個經(jīng)驗在pandas里寫正則時字符串前面務必加r例如r\d這樣Python不會把\d解析成轉(zhuǎn)義字符正則規(guī)則才能原樣傳給底層引擎。5. 數(shù)據(jù)清洗實操從缺失值到重復值一步步處理5.1 缺失值的定位與三種填充思路數(shù)據(jù)清洗是pandas的看家本領(lǐng)頭歌作業(yè)里也專門有pandas數(shù)據(jù)清洗的關(guān)卡。第一步永遠是定位缺失值df.isnull().sum()isnull()返回一個布爾型DataFramesum()按列統(tǒng)計True的個數(shù)一眼就能看出每列缺失多少。isna()和它完全等價哪個順手用哪個就行。第二步是決定怎么處理。如果你的數(shù)據(jù)集較大缺失行占比不高直接丟棄df_clean df.dropna()dropna()默認是只要某一行存在任意缺失值就刪除整行。如果只關(guān)注某些關(guān)鍵列是否存在缺失值要用subset參數(shù)指定df_clean df.dropna(subset[姓名, 電話])如果你不想刪行而是想把缺失值補上fillna()是主力。常見的三種填法都很實用# 用常數(shù)填充 df[備注] df[備注].fillna(無) # 數(shù)值列用均值填充 df[年齡] df[年齡].fillna(df[年齡].mean()) # 時間序列用前向填充 df[價格] df[價格].fillna(methodffill)前向填充就是拿上一行的值來填空適合股票價格、庫存這類連續(xù)變量的場景。填完以后最好重新執(zhí)行一次df_clean.isnull().sum().sum()確保缺失值清零了再進入下一步。5.2 重復值和異常值的處理套路重復值處理是另一個必考項。通常用duplicated()標記重復行配合drop_duplicates()去重df_no_dup df.drop_duplicates(subset[訂單號], keepfirst)這里subset指定判斷重復的字段子集只按訂單號判斷只要訂單號相同就視為重復記錄。keepfirst表示保留重復行中的第一條這是最常用的配置。如果不指定subset則是必須所有列完全一致才算重復這種要求比較嚴格實際中用處相對有限。異常值排查我個人習慣先用df.describe()看數(shù)值列的分布重點看min、max和均值之間是否有明顯不合理的地方。比如人均購買金額的最大值如果顯示是999999999那基本可以斷定是臟數(shù)據(jù)。定位到異常值之后最簡單的處理方式是用布爾條件把它過濾掉df df[(df[訂單金額] 0) (df[訂單金額] 100000)]這里注意pandas的邏輯與、邏輯或要用和|不要用Python的and和or這是一個高頻報錯點。還有一種替換的寫法把異常值替換成缺失值再走fillna流程df.loc[df[訂單金額] 100000, 訂單金額] pd.NA這條命令用的.loc定位加列賦值熟練之后你會發(fā)現(xiàn)寫復雜邏輯離不開它。6. ewm函數(shù)參數(shù)詳解別只會算平均6.1 什么是指數(shù)加權(quán)移動平均ewmExponentially Weighted Moving Average函數(shù)在pandas官方文檔里是有獨立條目的熱度不低。如果只看字面意思它和rolling().mean()很像都是計算移動平均但區(qū)別在于rolling窗口內(nèi)的每個數(shù)據(jù)權(quán)重相同而ewm會給近期數(shù)據(jù)更大的權(quán)重權(quán)重隨距離當前時間的遠近按指數(shù)衰減。簡單理解就是“越近的數(shù)據(jù)越重要”。為什么實際業(yè)務里經(jīng)常用ewm而不是簡單移動平均因為最近幾天的變化趨勢往往比一個月前的數(shù)據(jù)更能反映當前狀態(tài)股票均線、銷量趨勢預測、異常監(jiān)控這些場景都需要對近期數(shù)據(jù)更敏感。我舉個例子如果有一組連續(xù)數(shù)值直接用ewm計算不需要像rolling那樣設定窗口大小而是通過衰減參數(shù)來控制權(quán)重分布import pandas as pd s pd.Series([100, 102, 101, 105, 110]) ewm_result s.ewm(span3).mean() print(ewm_result)6.2 ewm核心參數(shù)與換算關(guān)系ewm函數(shù)里最核心的參數(shù)是com、span、halflife和alpha它們本質(zhì)上是同一種東西的四種等價表達方式。alpha是權(quán)重衰減因子取值在0到1之間。四個參數(shù)的換算關(guān)系如下參數(shù)傳入方式與alpha的換算關(guān)系alpha直接指定衰減因子alpha alphaspan指定跨度alpha 2 / (span 1)com指定質(zhì)心center of massalpha 1 / (1 com)halflife指定半衰期alpha 1 - exp(-ln(2) / halflife)平時用得最多的是span因為它的含義比較好理解跨度越大對歷史數(shù)據(jù)越“寬容”曲線越平滑。比如設置span5相當于在計算近5個周期左右的加權(quán)均值。下面這段代碼可以把換算過程驗證一遍s pd.Series([1, 2, 3, 4, 5]) result_span s.ewm(span3).mean() result_alpha s.ewm(alpha0.5).mean() print(result_span) print(result_alpha)算出來結(jié)果完全一致因為span3對應alpha0.5。我自己在實際復盤時習慣用span寫起來直觀調(diào)參時如果發(fā)現(xiàn)曲線太跳就把span調(diào)大比如從3調(diào)到5如果曲線反應太慢就把span調(diào)小。另外還有一個容易忽視的參數(shù)adjust。adjustTrue默認時ewm在計算時會考慮每個元素的權(quán)重修正adjustFalse時直接用遞歸公式y(tǒng)_t (1 - alpha) * y_{t-1} alpha * x_t。兩者的差異在數(shù)據(jù)序列較短時比較明顯長序列下會趨于一致。做算法題時如果結(jié)果和平臺預期對不上試著切換一下adjust的參數(shù)往往就是這里的問題。7. 常見問題與排查技巧實錄7.1 高頻報錯速查表這一節(jié)直接把實際項目里踩過的坑整理成表格遇到問題可以先來這里對號入座報錯信息常見原因解決思路ModuleNotFoundError: No module named pandas當前解釋器環(huán)境沒安裝pandas檢查PyCharm解釋器在Terminal中確認環(huán)境是否激活安裝pandasFileNotFoundError文件路徑不對或文件不在當前目錄使用os.getcwd()查看當前工作目錄用絕對路徑傳入read_csv或read_excelUnicodeDecodeError編碼不一致多半是GBK文件用了utf-8讀取把encoding切換到gbk或gb18030KeyError: 列名DataFrame里沒有這個列先執(zhí)行df.columns打印所有列名注意全角空格和大小寫差異ValueError: Length of values does not match length of index新列的數(shù)據(jù)長度和DataFrame行數(shù)不一致檢查創(chuàng)建新列時后面的列表長度如果需要對齊改用df[列] Series類型數(shù)據(jù)或使用loc定位SettingWithCopyWarning對切片副本做賦值操作在賦值前使用.copy()創(chuàng)建顯式副本或改用.loc切片進行賦值MemoryError文件過大一次性載入內(nèi)存不足用usecols只讀必要列或設置nrows分批讀取再或者用chunksize分塊處理單獨說一下SettingWithCopyWarning這個警告特別常見但又不影響程序運行很多人直接忽略。結(jié)果某天發(fā)現(xiàn)數(shù)據(jù)根本沒改成功回頭查才發(fā)現(xiàn)是警告在提醒你你操作的可能是DataFrame的臨時副本而不是原數(shù)據(jù)。我的習慣是在做任何子集篩選后立刻加.copy()df_subset df[df[城市] 北京].copy() df_subset[區(qū)域] 華北這樣一來df_subset就是獨立的新DataFrame后續(xù)操作完全可控不會再出現(xiàn)修改不生效的詭異問題。7.2 在頭歌平臺做題時的三個實用提醒很多人在頭歌平臺上刷pandas基礎題有一些平臺特有的注意事項值得提一下。第一頭歌評測環(huán)境里通常已經(jīng)預裝了pandas不需要在代碼里寫安裝命令也不建議寫。你只需要關(guān)心你的代碼邏輯評測時它會在一個干凈環(huán)境里重新執(zhí)行。第二題目給定的是一個模板文件文件名和路徑以題目的說明為準不要直接用本地路徑。比如題目要求讀取test.csv本地文件也放在項目根目錄那直接寫pd.read_csv(test.csv)就行前面不要拼C:\Users\...這種絕對路徑評測環(huán)境里根本不存在那個路徑。第三如果題目要求輸出特定的打印格式比如“輸出df的行數(shù)和列數(shù)格式為(行數(shù), 列數(shù))”那就老老實實用print(df.shape)不要自己加無關(guān)的說明文字或中文引號。評測系統(tǒng)經(jīng)常是逐字符比對輸出多一個空格都算錯。我一般在本地模擬測試時會把自己代碼運行后的輸出和題目示例輸出并排擺在一起按字符逐字檢查。df.shape返回的是一個元組格式比如(10, 4)正好符合“行數(shù), 列數(shù)”的題設。頭歌作業(yè)里還經(jīng)常出現(xiàn)要求“使用pandas讀取成績.xlsx中指定Sheet并輸出前幾行”這類題此時read_excel的sheet_name和nrows配合使用就很關(guān)鍵。8. 一個綜合小練習把上面的內(nèi)容串起來用光看不練假把式。我在這里用一個綜合案例把全流程走一遍場景是有一份CSV文件里面有客戶的訂單記錄包含“訂單號”、“客戶名”、“金額”、“下單日期”但數(shù)據(jù)里有缺失值、有重復記錄、金額列混入了逗號。需要清洗后按日期排序再輸出到Excel文件。import pandas as pd # 1. 讀取原始文件 df pd.read_csv(訂單列表.csv, encodinggbk) # 2. 查看基本信息和缺失情況 print(df.info()) print(df.isnull().sum()) # 3. 清理金額列去掉逗號并轉(zhuǎn)成數(shù)值 df[金額] df[金額].astype(str).str.replace(r,, , regexTrue) df[金額] pd.to_numeric(df[金額], errorscoerce) # 4. 解析日期 df[下單日期] pd.to_datetime(df[下單日期]) # 5. 刪除重復訂單號 df df.drop_duplicates(subset[訂單號], keepfirst) # 6. 刪除關(guān)鍵列缺失的行 df df.dropna(subset[訂單號, 客戶名, 金額]) # 7. 按日期排序 df df.sort_values(下單日期) # 8. 寫出Excel去掉行索引 df.to_excel(訂單清洗結(jié)果.xlsx, indexFalse)這個流程就是我平時處理訂單數(shù)據(jù)的簡化版。要先看結(jié)構(gòu)再定位問題再逐項清洗最后輸出結(jié)果。每一步執(zhí)行后我都建議打印df.shape確認行數(shù)變化比如刪完重復項行數(shù)從1000變成了980這種變化是預期的心里就有數(shù)了。9. 最后再分享一點我的使用習慣pandas的基礎內(nèi)容到這里該講的都講了從安裝環(huán)境、數(shù)據(jù)結(jié)構(gòu)、文件讀寫、類型轉(zhuǎn)換、正則配合、數(shù)據(jù)清洗到ewm參數(shù)整條線走下來日常大部分數(shù)據(jù)處理任務都能應付。我說說自己的習慣吧每次拿到一個新的DataFrame第一件事永遠是df.head()配合df.info()先把數(shù)據(jù)長什么樣、每列是什么類型看清楚再決定后面怎么處理。很多人上來就處理結(jié)果處理半天發(fā)現(xiàn)數(shù)據(jù)讀進來就已經(jīng)錯了。用df.info()還能順便看到Dtypes和Non-Null Count缺失情況一目了然。另外動手寫清洗代碼之前我會單獨弄一個Excel樣例文件在PyCharm里先跑通再轉(zhuǎn)移到大文件上。小樣本測試的成本極低但排查問題的效率非常高。如果你有自己常用的數(shù)據(jù)處理模板慢慢積累下來會發(fā)現(xiàn)pandas真正的威力是讓你把臟活累活標準化。下次你再看head歌作業(yè)或者實際項目的復雜表格就不會再害怕了。