【Python】整理20個(gè)Pandas統(tǒng)計(jì)函數(shù)
公眾號(hào):尤而小屋
作者:Peter
編輯:Peter
最近整理了pandas中20個(gè)常用統(tǒng)計(jì)函數(shù)和用法,建議收藏學(xué)習(xí)~

模擬數(shù)據(jù)
為了解釋每個(gè)函數(shù)的使用,模擬了一份帶有空值的數(shù)據(jù):
import?pandas?as?pd
import?numpy?as?np
import?matplotlib.pyplot?as?plt
import?seaborn?as?sns
df?=?pd.DataFrame({
????"sex":["male","male","female","female","male"],
????"age":[22,24,25,26,24],
????"chinese":[100,120,110,100,90],
????"math":[90,np.nan,100,80,120],??#?存在空值
????"english":[90,130,90,80,100]})
df

描述統(tǒng)計(jì)信息describe
descirbe方法只能針對序列或數(shù)據(jù)框,一維數(shù)組是沒有這個(gè)方法的;同時(shí)默認(rèn)只能針對數(shù)值型的數(shù)據(jù)進(jìn)行統(tǒng)計(jì):
DataFrame.describe(percentiles=None,include=None,exclude=None)
percentiles:可選折的百分?jǐn)?shù),列表形式;數(shù)值在0-1之間,默認(rèn)是[.25,.5,.75] include/exclude:包含和排除的數(shù)據(jù)類型信息
返回的信息包含:
非空值的數(shù)量count;特例:math字段中有一個(gè)空值 均值mean 標(biāo)準(zhǔn)差std 最小值min 最大值max 25%、50%、75%分位數(shù)
df.describe()

添加了參數(shù)后的情況,我們發(fā)現(xiàn):
sex字段的相關(guān)信息也被顯示出來 顯示的信息更豐富,多了unique、top、freq等等

非空值數(shù)量count
返回的是每個(gè)字段中非空值的數(shù)量
In [5]:
df.count()
Out[5]:
sex????????5
age????????5
chinese????5
math???????4??#?包含一個(gè)空值
english????5
dtype:?int64
求和sum
In [6]:
df.sum()
在這里我們發(fā)現(xiàn):如果字段是object類型的,sum函數(shù)的結(jié)果就是直接將全部取值拼接起來
Out[6]:
sex????????malemalefemalefemalemale?#?拼接
age?????????????????????????????121??#?相加求和
chinese?????????????????????????520
math??????????????????????????390.0
english?????????????????????????490
dtype:?object
最大值max
In [7]:
df.max()
針對字符串的最值(最大值或者最小值),是根據(jù)字母的ASCII碼大小來進(jìn)行比較的:
先比較首字母的大小 首字母相同的話,再比較第二個(gè)字母
Out[7]:
sex?????????male??
age???????????26
chinese??????120
math???????120.0
english??????130
dtype:?object
最小值min
和max函數(shù)的求解是類似的:
In [8]:
df.min()
Out[8]:
sex????????female
age????????????22
chinese????????90
math?????????80.0
english????????80
dtype:?object
分位數(shù)quantile
返回指定位置的分位數(shù)
In [9]:
df.quantile(0.2)
Out[9]:
age????????23.6
chinese????98.0
math???????86.0
english????88.0
Name:?0.2,?dtype:?float64
In [10]:
df.quantile(0.25)
Out[10]:
age?????????24.0
chinese????100.0
math????????87.5
english?????90.0
Name:?0.25,?dtype:?float64
In [11]:
df.quantile(0.75)
Out[11]:
age?????????25.0
chinese????110.0
math???????105.0
english????100.0
Name:?0.75,?dtype:?float64
通過箱型圖可以展示一組數(shù)據(jù)的25%、50%、75%的中位數(shù):
In [12]:
plt.figure(figsize=(12,6))#設(shè)置畫布的尺寸
plt.boxplot([df["age"],df["chinese"],df["english"]],
???????????labels?=?["age","chinese","english"],
#????????????vert=False,?
???????????showmeans=True,
???????????patch_artist?=?True,?
???????????boxprops?=?{'color':'orangered','facecolor':'pink'}
#????????????showgrid=True
???????????)
plt.show()

箱型圖的具體展示信息:

均值mean
一組數(shù)據(jù)的平均值
In [13]:
df.mean()
Out[13]:
age?????????24.2
chinese????104.0
math????????97.5
english?????98.0
dtype:?float64
通過下面的例子我們發(fā)現(xiàn):如果字段中存在缺失值(math存在缺失值),此時(shí)樣本的個(gè)數(shù)會(huì)自動(dòng)忽略缺失值的總數(shù)
In [14]:
390/4??#?個(gè)數(shù)不含空值
Out[14]:
97.5
中值/中位數(shù)median
比如:1,2,3,4,5 的中位數(shù)就是3
再比如:1,2,3,4,5,6 的中位數(shù)就是 3+4 = 3.5
In [15]:
df.median()
Out[15]:
age?????????24.0
chinese????100.0
math????????95.0
english?????90.0
dtype:?float64
眾數(shù)mode
一組數(shù)據(jù)中出現(xiàn)次數(shù)最多的數(shù)
In [16]:
df.mode()
Out[16]:

最大值索引idmax
idxmax() 返回的是最大值的索引
In [17]:
df["age"].idxmax()
Out[17]:
3
In [18]:
df["chinese"].idxmin()
Out[18]:
4
不能字符類型的字段使用該函數(shù),Pandas不支持:
In [19]:
df["sex"].idxmax()

最小值索引idxmin
返回最小值所在的索引
In [20]:
df["age"].idxmin()
Out[20]:
0
In [21]:
df["math"].idxmin()
Out[21]:
3
In [22]:
df["sex"].idxmin()
不能字符類型的字段使用該函數(shù),Pandas不支持:

方差var
計(jì)算一組數(shù)據(jù)的方差,需要注意的是:numpy中的方差叫總體方差,pandas中的方差叫樣本方差
標(biāo)準(zhǔn)差(或方差)分為 總體標(biāo)準(zhǔn)差(方差)和 樣本標(biāo)準(zhǔn)差(方差)
前者分母為n,右偏的;后者分母為n-1,是無偏的 pandas里是算無偏的;numpy里是有偏的
In [23]:
df.var()
Out[23]:
age??????????2.200000
chinese????130.000000
math???????291.666667??#?pandas計(jì)算結(jié)果
english????370.000000
dtype:?float64
In [24]:
df["math"].var()
Out[24]:
291.6666666666667
In [25]:
np.var(df["math"])??#?numpy計(jì)算結(jié)果
Out[25]:
218.75
In [26]:
np.var(df["age"])
Out[26]:
1.7600000000000002
In [27]:
np.var(df["english"])
Out[27]:
296.0
標(biāo)準(zhǔn)差std
返回的是一組數(shù)據(jù)的標(biāo)準(zhǔn)差
In [28]:
df.std()
Out[28]:
age?????????1.483240
chinese????11.401754
math???????17.078251
english????19.235384
dtype:?float64
In [29]:
np.std(df["math"])
Out[29]:
14.79019945774904
In [30]:
np.std(df["english"])
Out[30]:
17.204650534085253
In [31]:
np.std(df["age"])
Out[31]:
1.32664991614216
如何理解pandas和numpy兩種方法對方差的求解不同:

平均絕對偏差mad

In [32]:
df.mad()
Out[32]:
age?????????1.04
chinese?????8.80
math???????12.50
english????13.60
dtype:?float64
以字段age為例:
In [33]:
df["age"].mad()
Out[33]:
1.0399999999999998
In [34]:
df["age"].tolist()
Out[34]:
[22,?24,?25,?26,?24]
In [35]:
age_mean?=?df["age"].mean()
age_mean
Out[35]:
24.2
In [36]:
(abs(22-age_mean)?+?abs(24-age_mean)?+?abs(25-age_mean)?
?+?abs(26-age_mean)?+?abs(24-age_mean))?/?5
Out[36]:
1.0399999999999998
偏度-skew
介紹峰度和偏度的好文章:https://www.cnblogs.com/wyy1480/p/10474046.html
偏度(skewness),是統(tǒng)計(jì)數(shù)據(jù)分布偏斜方向和程度的度量,是統(tǒng)計(jì)數(shù)據(jù)分布非對稱程度的數(shù)字特征。
偏度(Skewness)亦稱偏態(tài)、偏態(tài)系數(shù),表征概率分布密度曲線相對于平均值不對稱程度的特征數(shù)。
直觀看來就是密度函數(shù)曲線尾部的相對長度。定義上偏度是樣本的三階標(biāo)準(zhǔn)化矩:

In [37]:
df.skew()
Out[37]:
age???????-0.551618
chinese????0.404796
math???????0.752837
english????1.517474
dtype:?float64
In [38]:
df["age"].skew()
Out[38]:
-0.5516180692881046
峰度-kurt
返回的是峰度值
In [39]:
df.kurt()
Out[39]:
age????????0.867769
chinese???-0.177515
math???????0.342857
english????2.607743
dtype:?float64
In [40]:
df["age"].kurt()
Out[40]:
0.8677685950413174
In [41]:
df["math"].kurt()
Out[41]:
0.3428571428571434??????
絕對值abs
返回?cái)?shù)據(jù)的絕對值:
In [45]:
df["age"].abs()
Out[45]:
0????22
1????24
2????25
3????26
4????24
Name:?age,?dtype:?int64
如果存在缺失值,絕對值函數(shù)求解后仍是NaN:
In [46]:
df["math"].abs()
Out[46]:
0?????90.0
1??????NaN
2????100.0
3?????80.0
4????120.0
Name:?math,?dtype:?float64
絕對值函數(shù)是針對數(shù)值型的字段,不能對字符類型的字段求絕對值:
In [47]:
#?字符類型的數(shù)據(jù)報(bào)錯(cuò)
df["sex"].abs()

元素乘積prod
In [48]:
df.prod()
Out[48]:
age????????8.236800e+06
chinese????1.188000e+10
math???????8.640000e+07
english????8.424000e+09
dtype:?float64
In [49]:
df["age"].tolist()
Out[49]:
[22,?24,?25,?26,?24]
In [50]:
22?*?24?*?25?*?26?*?24
Out[50]:
8236800
累計(jì)求和cumsum
In [51]:
df.cumsum()

累計(jì)乘積cumprod
In [52]:
df["age"].cumprod()
Out[52]:
0?????????22
1????????528
2??????13200
3?????343200
4????8236800
Name:?age,?dtype:?int64
In [53]:
df["math"].cumprod()
Out[53]:
0??????????90.0
1???????????NaN
2????????9000.0
3??????720000.0
4????86400000.0
Name:?math,?dtype:?float64
In [54]:
#?字符類型字段報(bào)錯(cuò)
df["sex"].cumprod()

20個(gè)統(tǒng)計(jì)函數(shù)
最后再總結(jié)下Pandas中常用來描述統(tǒng)計(jì)信息的函數(shù):

往期精彩回顧
