今天我們重新盤點(diǎn)66個(gè)Pandas函數(shù)合集,包括數(shù)據(jù)預(yù)覽、數(shù)值數(shù)據(jù)操作、文本數(shù)據(jù)操作、行/列操作等等,涉及“ 數(shù)據(jù)清洗 ”的方方面面。
Pandas 是基于NumPy的一種工具,該工具是為解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的。它提供了大量能使我們快速便捷地處理數(shù)據(jù)的函數(shù)和方法。
數(shù)據(jù)預(yù)覽
對(duì)于探索性數(shù)據(jù)分析來(lái)說(shuō),做數(shù)據(jù)分析前需要先看一下數(shù)據(jù)的總體概況。info()
方法用來(lái)查看數(shù)據(jù)集信息,describe()
方法將返回描述性統(tǒng)計(jì)信息,這兩個(gè)函數(shù)大家應(yīng)該都很熟悉了。
describe方法默認(rèn)只給出數(shù)值型變量的常用統(tǒng)計(jì)量,要想對(duì)DataFrame中的每個(gè)變量進(jìn)行匯總統(tǒng)計(jì),可以將其中的參數(shù)include設(shè)為all。
head()
方法和tail()
方法則是分別顯示數(shù)據(jù)集的前n和后n行數(shù)據(jù)。如果想要隨機(jī)看N行的數(shù)據(jù),可以使用sample()
方法。
df.sample(3)
輸出:
如果要檢查數(shù)據(jù)中各列的數(shù)據(jù)類型,可以使用.dtypes
;如果想要值查看所有的列名,可以使用.columns
。
df.columns
輸出:
Index(['日期', '銷量'], dtype='object')
前面介紹的函數(shù)主要是讀取數(shù)據(jù)集的數(shù)據(jù)信息,想要獲得數(shù)據(jù)集的大小(長(zhǎng)寬),可以使用.shape
方法。
df.shape
輸出:
(5, 2)
另外,len()
可以查看某列的行數(shù),count()
則可以查看該列值的有效個(gè)數(shù),不包含無(wú)效值(Nan)。
缺失值與重復(fù)值
Pandas清洗數(shù)據(jù)時(shí),判斷缺失值一般采用isnull()
方法。此外,isnull().any()
會(huì)判斷哪些”列”存在缺失值,isnull().sum()
用于將列中為空的個(gè)數(shù)統(tǒng)計(jì)出來(lái)。
df.isnull().any()
輸出:
日期 False
銷量 True
dtype: bool
發(fā)現(xiàn)“銷量”這列存在缺失值后,處理辦法要么刪除dropna()
,要么填充fillna()
。
df.fillna(50)
輸出:
Pandas清洗數(shù)據(jù)時(shí),判斷重復(fù)值一般采用duplicated()
方法。如果想要直接刪除重復(fù)值,可以使用drop_duplicates()
方法。此處較為常見,不再過(guò)多演示。
數(shù)值數(shù)據(jù)操作
我們?cè)谔幚頂?shù)據(jù)的時(shí)候,會(huì)遇到批量替換的情況,replace()
是很好的解決方法。它既支持替換全部或者某一行,也支持替換指定的某個(gè)或指定的多個(gè)數(shù)值(用字典的形式),還可以使用正則表達(dá)式替換。
df["編號(hào)"].replace(r'BA.$', value='NEW', regex=True, inplace = True)
輸出:
在Pandas模塊中, 調(diào)?rank()
?法可以實(shí)現(xiàn)數(shù)據(jù)排名。
df["排名"] = df.rank(method="dense").astype("int")
輸出:
rank()
?法中的method參數(shù),它有5個(gè)常?選項(xiàng),可以幫助我們實(shí)現(xiàn)不同情況下的排名。
clip()
方法,用于對(duì)超過(guò)或者低于某些數(shù)的數(shù)值進(jìn)行截?cái)?^[1]^ ,來(lái)保證數(shù)值在一定范圍。比如每月的遲到天數(shù)一定是在0-31天之間。
df["遲到天數(shù)"] = df["遲到天數(shù)"].clip(0,31)
唯一值 ,unique()
是以數(shù)組形式返回列的所有唯一值,而nunique()
返回的是唯一值的個(gè)數(shù)。
df["gender"].unique()
df["gender"].nunique()
輸出:
在數(shù)值數(shù)據(jù)操作中,apply()
函數(shù)的功能是將一個(gè)自定義函數(shù)作用于DataFrame的行或者列;applymap()
函數(shù)的功能是將自定義函數(shù)作用于DataFrame的所有元素。他們通常也與匿名函數(shù)lambda一起使用。
df["數(shù)量"].apply(lambda x: x+1)
輸出:
文本數(shù)據(jù)操作
之前我們?cè)?jīng)介紹過(guò)經(jīng)常被人忽視的:Pandas 文本型數(shù)據(jù)處理。在對(duì)文本型的數(shù)據(jù)進(jìn)行處理時(shí),我們會(huì)大量應(yīng)用字符串的函數(shù),來(lái)實(shí)現(xiàn)對(duì)一列文本數(shù)據(jù)進(jìn)行操作 ^[2]^ 。
函數(shù)方法 | 用法釋義 |
---|---|
cat | 字符串的拼接 |
contains | 判斷某個(gè)字符串是否包含給定字符 |
startswith/endswith | 判斷某個(gè)字符串是否以...開頭/結(jié)尾 |
get | 獲取指定位置的字符串 |
len | 計(jì)算字符串長(zhǎng)度 |
upper、lower | 英文大小寫轉(zhuǎn)換 |
pad/center | 在字符串的左邊、右邊或左右兩邊添加給定字符 |
repeat | 重復(fù)字符串幾次 |
slice_replace | 使用給定的字符串,替換指定的位置的字符 |
split | 分割字符串,將一列擴(kuò)展為多列 |
strip、rstrip、lstrip | 去除空白符、換行符 |
findall | 利用正則表達(dá)式,去字符串中匹配,返回查找結(jié)果的列表 |
extract、extractall | 接受正則表達(dá)式,抽取匹配的字符串(一定要加上括號(hào)) |
舉例:
df.insert(2, "姓名",
df["姓"].str.cat(df["名"], sep=""))
輸出:
df["手機(jī)號(hào)碼"] = df["手機(jī)號(hào)碼"].str.slice_replace(3,7,"*"*4)
輸出:
df["地址"].str.extract("([u4e00-u9fa5]+)")
輸出:
行/列操作
數(shù)據(jù)清洗時(shí),會(huì)將帶空值的行刪除,此時(shí)DataFrame或Series類型的數(shù)據(jù)不再是連續(xù)的索引,可以使用reset_index()
重置索引。
df.reset_index(drop=True)
輸出:
rename()
重命名用于更改行列的標(biāo)簽,即行列的索引??梢詡魅胍粋€(gè)字典或者一個(gè)函數(shù)。在數(shù)據(jù)預(yù)處理中,比較常用。
df.rename(columns={'mark': 'sell'}, inplace=True)
輸出:
行列轉(zhuǎn)置,我們可以使用T屬性獲得轉(zhuǎn)置后的DataFrame。
df.T
輸出:
刪除行列,可以使用drop()
。
df.drop(columns=["mark"])
輸出:
數(shù)據(jù)分析師在進(jìn)行數(shù)據(jù)處理時(shí)經(jīng)常會(huì)遇到長(zhǎng)寬表互轉(zhuǎn)的情況,這也是一道常見的數(shù)據(jù)分析面試題。
melt()
方法可以將寬表轉(zhuǎn)長(zhǎng)表,即表格型數(shù)據(jù)轉(zhuǎn)為樹形數(shù)據(jù)。
df.melt(id_vars="姓名", var_name="科目", value_name="成績(jī)")
輸出:
pivot()
方法可以將長(zhǎng)表轉(zhuǎn)寬表,即樹形數(shù)據(jù)轉(zhuǎn)為表格型數(shù)據(jù)。
df.pivot(index='姓名', columns='科目', values='成績(jī)')
輸出:
pivot()
其實(shí)就是用 set_index()
創(chuàng)建層次化索引,再用unstack()
重塑
df1.set_index(['姓名','科目']).unstack('科目')
數(shù)據(jù)分組與數(shù)據(jù)透視表更是一個(gè)常見的需求,groupby()
方法可以用于數(shù)據(jù)分組。
df.groupby("科目").mean()
由于pivot_table()
數(shù)據(jù)透視表的參數(shù)比較多,就不再使用案例來(lái)演示了,具體用法可參考下圖。
數(shù)據(jù)篩選
如果是篩選行列的話,通常有以下幾種方法:
有時(shí)我們需要按條件選擇部分列、部分行,一般常用的方法有:
操作 | 語(yǔ)法 | 返回結(jié)果 |
---|---|---|
選擇列 | df[col] | Series |
按索引選擇行 | df.loc[label] | Series |
按數(shù)字索引選擇行 | df.iloc[loc] | Series |
使用切片選擇行 | df[:5] | DataFrame |
用表達(dá)式篩選行^[3]^ | df[bool_vec] | DataFrame |
除此以外,還有很多方法/函數(shù)可以用于“數(shù)據(jù)篩選”。
如果想直接篩選包含特定字符的字符串,可以使用contains()
這個(gè)方法。
例如,篩選戶籍地址列中包含“黑龍江”這個(gè)字符的所有行。
df[df["戶籍地址"].str.contains("黑龍江")]
query()
查詢方法也可以用來(lái)篩選數(shù)據(jù),比如查詢“語(yǔ)文”成績(jī)大于“數(shù)學(xué)”成績(jī)的行記錄。
df.query("語(yǔ)文 > 英語(yǔ)")
輸出:
select_dtypes()
方法可用于篩選某些數(shù)據(jù)類型的變量或列。舉例,我們僅選擇具有數(shù)據(jù)類型'int64'的列。
df.select_dtypes("int64")
輸出:
isin()
接受一個(gè)列表,判斷該列中元素是否在列表中。
name_list = ["張三", "李四"]
df[df["姓名"].isin(name_list)]
輸出:
數(shù)值數(shù)據(jù)統(tǒng)計(jì)運(yùn)算
在對(duì)數(shù)值型的數(shù)據(jù)進(jìn)行統(tǒng)計(jì)運(yùn)算時(shí),除了有算術(shù)運(yùn)算、比較預(yù)算還有各種常見的匯總統(tǒng)計(jì)運(yùn)行函數(shù),具體如下表所示。
函數(shù)方法 | 用法釋義 |
---|---|
count | 非NaN數(shù)據(jù)項(xiàng)計(jì)數(shù) |
sum | 求和 |
mean | 平均值 |
median | 中位數(shù) |
mode | 眾數(shù) |
max | 最大值 |
min | 最小值 |
std | 標(biāo)準(zhǔn)差 |
var | 方差 |
quantile | 分位數(shù) |
skew | 返回偏態(tài)系數(shù) |
kurt | 返回峰態(tài)系數(shù) |
舉例:
df["語(yǔ)文"].max()
輸出:
155
最后,再說(shuō)一個(gè)比較常用的統(tǒng)計(jì)運(yùn)算函數(shù)——累加cumsum()
。
df["累計(jì)銷量"] = df["銷量"].cumsum()
輸出:
注:cumprod()
方法是指連乘,用于與連加一樣,但使用頻率較少。
今天我們盤點(diǎn)了66個(gè)Pandas函數(shù)合集,但實(shí)際還有很多函數(shù)在本文中沒(méi)有介紹,包括時(shí)間序列、數(shù)據(jù)表的拼接與連接等等。此外,那些類似describe()
這種大家非常熟悉的方法都省去了代碼演示。如果大家有在工作生活中進(jìn)行“數(shù)據(jù)清洗”非常有用的Pandas函數(shù),也可以在評(píng)論區(qū)交流。
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7134瀏覽量
89461 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4345瀏覽量
62905
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論