盤點66個Pandas函數,輕松搞定“數據清洗”!

Pandas 是基于NumPy的一種工具,該工具是為解決數據分析任務而創建的。它提供了大量能使我們快速便捷地處理數據的函數和方法。
數據預覽
對于探索性數據分析來說,做數據分析前需要先看一下數據的總體概況。??info()??方法用來查看數據集信息,??describe()??方法將返回描述性統計信息,這兩個函數大家應該都很熟悉了。
describe方法默認只給出數值型變量的常用統計量,要想對DataFrame中的每個變量進行匯總統計,可以將其中的參數include設為all。
??head()??方法和??tail()?? 方法則是分別顯示數據集的前n和后n行數據。如果想要隨機看N行的數據,可以使用??sample()??方法。
df.sample(3)
輸出:

如果要檢查數據中各列的數據類型,可以使用??.dtypes??;如果想要值查看所有的列名,可以使用??.columns??。
df.columns
輸出:
Index(['日期', '銷量'], dtype='object')
前面介紹的函數主要是讀取數據集的數據信息,想要獲得數據集的大小(長寬),可以使用??.shape??方法。
df.shape
輸出:
(5, 2)
另外,??len()??可以查看某列的行數,??count()??則可以查看該列值的有效個數,不包含無效值(Nan)。
缺失值與重復值
Pandas清洗數據時,判斷缺失值一般采用??isnull()??方法。此外,??isnull().any()??會判斷哪些”列”存在缺失值,??isnull().sum()??用于將列中為空的個數統計出來。
df.isnull().any()
輸出:
日期 False
銷量 True
dtype: bool
發現“銷量”這列存在缺失值后,處理辦法要么刪除??dropna()?? ,要么填充??fillna()??。
df.fillna(50)
輸出:

Pandas清洗數據時,判斷重復值一般采用??duplicated()??方法。如果想要直接刪除重復值,可以使用??drop_duplicates()?? 方法。此處較為常見,不再過多演示。
數值數據操作
我們在處理數據的時候,會遇到批量替換的情況,??replace()??是很好的解決方法。它既支持替換全部或者某一行,也支持替換指定的某個或指定的多個數值(用字典的形式),還可以使用正則表達式替換。
df["編號"].replace(r'BA.$', value='NEW', regex=True, inplace = True)
輸出:

在Pandas模塊中, 調???rank()???法可以實現數據排名。
df["排名"] = df.rank(method="dense").astype("int")
輸出:

??rank()???法中的method參數,它有5個常?選項,可以幫助我們實現不同情況下的排名。

??clip()??方法,用于對超過或者低于某些數的數值進行截斷[1],來保證數值在一定范圍。比如每月的遲到天數一定是在0-31天之間。
df["遲到天數"] = df["遲到天數"].clip(0,31)

唯一值,??unique()??是以數組形式返回列的所有唯一值,而??nunique()??返回的是唯一值的個數。
df["gender"].unique()
df["gender"].nunique()
輸出:

在數值數據操作中,??apply()??函數的功能是將一個自定義函數作用于DataFrame的行或者列;??applymap()??函數的功能是將自定義函數作用于DataFrame的所有元素。他們通常也與匿名函數lambda一起使用。
df["數量"].apply(lambda x: x+1)
輸出:

文本數據操作
之前我們曾經介紹過??經常被人忽視的:Pandas 文本型數據處理??。在對文本型的數據進行處理時,我們會大量應用字符串的函數,來實現對一列文本數據進行操作[2]。
函數方法 | 用法釋義 |
cat | 字符串的拼接 |
contains | 判斷某個字符串是否包含給定字符 |
startswith/endswith | 判斷某個字符串是否以...開頭/結尾 |
get | 獲取指定位置的字符串 |
len | 計算字符串長度 |
upper、lower | 英文大小寫轉換 |
pad/center | 在字符串的左邊、右邊或左右兩邊添加給定字符 |
repeat | 重復字符串幾次 |
slice_replace | 使用給定的字符串,替換指定的位置的字符 |
split | 分割字符串,將一列擴展為多列 |
strip、rstrip、lstrip | 去除空白符、換行符 |
findall | 利用正則表達式,去字符串中匹配,返回查找結果的列表 |
extract、extractall | 接受正則表達式,抽取匹配的字符串(一定要加上括號) |
舉例:
df.insert(2, "姓名",
df["姓"].str.cat(df["名"], sep=""))
輸出:

df["手機號碼"] = df["手機號碼"].str.slice_replace(3,7,"*"*4)
輸出:

df["地址"].str.extract("([\u4e00-\u9fa5]+)")
輸出:

行/列操作
數據清洗時,會將帶空值的行刪除,此時DataFrame或Series類型的數據不再是連續的索引,可以使用??reset_index()??重置索引。
df.reset_index(drop=True)
輸出:

??rename()??重命名用于更改行列的標簽,即行列的索引。可以傳入一個字典或者一個函數。在數據預處理中,比較常用。
df.rename(columns={'mark': 'sell'}, inplace=True)
輸出:

行列轉置,我們可以使用T屬性獲得轉置后的DataFrame。
df.T
輸出:

刪除行列,可以使用??drop()??。
df.drop(columns=["mark"])
輸出:

數據分析師在進行數據處理時經常會遇到長寬表互轉的情況,這也是一道常見的數據分析面試題。
??melt()??方法可以將寬表轉長表,即表格型數據轉為樹形數據。
df.melt(id_vars="姓名", var_name="科目", value_name="成績")
輸出:

??pivot()??方法可以將長表轉寬表,即樹形數據轉為表格型數據。
df.pivot(index='姓名', columns='科目', values='成績')
輸出:

??pivot()??其實就是用 ??set_index()??創建層次化索引,再用??unstack()??重塑
df1.set_index(['姓名','科目']).unstack('科目')

數據分組與數據透視表更是一個常見的需求,??groupby()??方法可以用于數據分組。
df.groupby("科目").mean()

由于??pivot_table()??數據透視表的參數比較多,就不再使用案例來演示了,具體用法可參考下圖。

數據篩選
如果是篩選行列的話,通常有以下幾種方法:
有時我們需要按條件選擇部分列、部分行,一般常用的方法有:
操作 | 語法 | 返回結果 |
選擇列 | ? | Series |
按索引選擇行 | ? | Series |
按數字索引選擇行 | ? | Series |
使用切片選擇行 | ? | DataFrame |
用表達式篩選行[3] | ? | DataFrame |
除此以外,還有很多方法/函數可以用于“數據篩選”。
如果想直接篩選包含特定字符的字符串,可以使用??contains()??這個方法。
例如,篩選戶籍地址列中包含“黑龍江”這個字符的所有行。
df[df["戶籍地址"].str.contains("黑龍江")]
??query()??查詢方法也可以用來篩選數據,比如查詢“語文”成績大于“數學”成績的行記錄。
df.query("語文 > 英語")
輸出:

??select_dtypes()??方法可用于篩選某些數據類型的變量或列。舉例,我們僅選擇具有數據類型'int64'的列。
df.select_dtypes("int64")
輸出:

??isin()??接受一個列表,判斷該列中元素是否在列表中。
name_list = ["張三", "李四"]
df[df["姓名"].isin(name_list)]
輸出:

數值數據統計運算
在對數值型的數據進行統計運算時,除了有算術運算、比較預算還有各種常見的匯總統計運行函數,具體如下表所示。
函數方法 | 用法釋義 |
count | 非NaN數據項計數 |
sum | 求和 |
mean | 平均值 |
median | 中位數 |
mode | 眾數 |
max | 最大值 |
min | 最小值 |
std | 標準差 |
var | 方差 |
quantile | 分位數 |
skew | 返回偏態系數 |
kurt | 返回峰態系數 |
舉例:
df["語文"].max()
輸出:
155
最后,再說一個比較常用的統計運算函數——累加??cumsum()??。
df["累計銷量"] = df["銷量"].cumsum()
輸出:

注:??cumprod()??方法是指連乘,用于與連加一樣,但使用頻率較少。
今天我們盤點了66個Pandas函數合集,但實際還有很多函數在本文中沒有介紹,包括時間序列、數據表的拼接與連接等等。此外,那些類似??describe()??這種大家非常熟悉的方法都省去了代碼演示。如果大家有在工作生活中進行“數據清洗”非常有用的Pandas函數,也可以在評論區交流。
參考資料
[1]小小明-Pandas的clip和replace正則替換: https://blog.csdn.net/as604049322/article/details/105985763
[2]經常被人忽視的:Pandas文本型數據處理: https://mp.weixin.qq.com/s/Tdcb6jlyCc7XlQWZlvEd_w
[3]深入淺出Pandas: 利用Python進行數據處理與分析




























