【精华总结】全文4000字、20个案例详解Pandas当中的数据统计分析与排序
今天小編來給大家講一下Pandas模塊當中的數據統計與排序,說到具體的就是value_counts()方法以及sort_values()方法。
value_counts()方法,顧名思義,主要是用于計算各個類別出現的次數的,而sort_values()方法則是對數值來進行排序,當然除了這些,還有很多大家不知道的衍生的功能等待被挖掘,下面小編就帶大家一個一個的說過去。
導入模塊并且讀取數據庫
我們這次用到的數據集是“非常有名”的泰坦尼克號的數據集,該數據源能夠在很多平臺上都能夠找得到
import?pandas?as?pd df?=?pd.read_csv("titanic_train.csv") df.head()output
常規的用法
首先我們來看一下常規的用法,代碼如下
df['Embarked'].value_counts()output
S????644 C????168 Q?????77 Name:?Embarked,?dtype:?int64下面我們簡單來介紹一下value_counts()方法當中的參數,
DataFrame.value_counts(subset=None,normalize=False,sort=True,ascending=False,dropna=True)常用到參數的具體解釋為:
subset: 表示根據什么字段或者索引來進行統計分析
normalize: 返回的是比例而不是頻次
ascending: 降序還是升序來排
dropna: 是否需要包含有空值的行
對數值進行排序
上面返回的結果是按照從大到小來進行排序的,當然我們也可以反過來,從小到大來進行排序,代碼如下
df['Embarked'].value_counts(ascending=True)output
Q?????77 C????168 S????644 Name:?Embarked,?dtype:?int64對索引的字母進行排序
同時我們也可以對索引,按照字母表的順序來進行排序,代碼如下
df['Embarked'].value_counts(ascending=True).sort_index(ascending=True)output
C????168 Q?????77 S????644 Name:?Embarked,?dtype:?int64當中的ascending=True指的是升序排序
包含對空值的統計
默認的是value_counts()方法不會對空值進行統計,那要是我們也希望對空值進行統計的話,就可以加上dropna參數,代碼如下
df['Embarked'].value_counts(dropna=False)output
S??????644 C??????168 Q???????77 NaN??????2 Name:?Embarked,?dtype:?int64百分比式的數據統計
我們可以將數值的統計轉化成百分比式的統計,可以更加直觀地看到每一個類別的占比,代碼如下
df['Embarked'].value_counts(normalize=True)output
S????0.724409 C????0.188976 Q????0.086614 Name:?Embarked,?dtype:?float64要是我們希望對能夠在后面加上一個百分比的符號,則需要在Pandas中加以設置,對數據的展示加以設置,代碼如下
pd.set_option('display.float_format',?'{:.2%}'.format) df['Embarked'].value_counts(normalize?=?True)output
S???72.44% C???18.90% Q????8.66% Name:?Embarked,?dtype:?float64當然除此之外,我們還可以這么來做,代碼如下
df['Embarked'].value_counts(normalize?=?True).to_frame().style.format('{:.2%}')output
Embarked S?72.44% C?18.90% Q?8.66%連續型數據分箱
和Pandas模塊當中的cut()方法相類似的在于,我們這里也可以將連續型數據進行分箱然后再來統計,代碼如下
df['Fare'].value_counts(bins=3)output
(-0.513,?170.776]?????871 (170.776,?341.553]?????17 (341.553,?512.329]??????3 Name:?Fare,?dtype:?int64我們將Fare這一列同等份的分成3組然后再來進行統計,當然我們也可以自定義每一個分組的上限與下限,代碼如下
df['Fare'].value_counts(bins=[-1,?20,?100,?550])output
(-1.001,?20.0]????515 (20.0,?100.0]?????323 (100.0,?550.0]?????53 Name:?Fare,?dtype:?int64分組再統計
pandas模塊當中的groupby()方法允許對數據集進行分組,它也可以和value_counts()方法聯用更好地來進行統計分析,代碼如下
df.groupby('Embarked')['Sex'].value_counts()output
Embarked??Sex??? C?????????male???????95female?????73 Q?????????male???????41female?????36 S?????????male??????441female????203 Name:?Sex,?dtype:?int64上面的代碼是針對“Embarked”這一類別下的“Sex”特征進行分組,然后再進一步進行數據的統計分析,當然出來的結果是Series數據結構,要是我們想讓Series的數據結果編程DataFrame數據結構,可以這么來做,
df.groupby('Embarked')['Sex'].value_counts().to_frame()數據集的排序
下面我們來談一下數據的排序,主要用到的是sort_values()方法,例如我們根據“年齡”這一列來進行排序,排序的方式為降序排,代碼如下
df.sort_values("Age",?ascending?=?False).head(10)output
對行索引重新排序
我們看到排序過之后的DataFrame數據集行索引依然沒有變,我們希望行索引依然可以是從0開始依次的遞增,就可以這么來做,代碼如下
df.sort_values("Age",?ascending?=?False,?ignore_index?=?True).head(10)output
下面我們簡單來介紹一下sort_values()方法當中的參數
DataFrame.sort_values(by,?axis=0,?ascending=True,?inplace=False,?kind='quicksort',?na_position='last',?# last,first;默認是lastignore_index=False,?key=None)常用到參數的具體解釋為:
by: 表示根據什么字段或者索引來進行排序,可以是一個或者是多個
axis: 是水平方向排序還是垂直方向排序,默認是垂直方向
ascending: 排序方式,是升序還是降序來排
inplace: 是生成新的DataFrame還是在原有的基礎上進行修改
kind: 所用到的排序的算法,有快排quicksort或者是歸并排序mergesort、堆排序heapsort等等
ignore_index: 是否對行索引進行重新的排序
對多個字段的排序
我們還可以對多個字段進行排序,代碼如下
df.sort_values(["Age",?"Fare"],?ascending?=?False).head(10)output
同時我們也可以對不同的字段指定不同的排序方式,如下
df.sort_values(["Age",?"Fare"],?ascending?=?[False,?True]).head(10)output
我們可以看到在“Age”一樣的情況下,“Fare”字段是按照升序的順序來排的
自定義排序
我們可以自定義一個函數方法,然后運用在sort_values()方法當中,讓其按照自己寫的方法來排序,我們看如下的這組數據
df?=?pd.DataFrame({'product':?['keyboard',?'mouse',?'desk',?'monitor',?'chair'],'category':?['C',?'C',?'O',?'C',?'O'],'year':?[2002,?2002,?2005,?2001,?2003],'cost':?['$52',?'$24',?'$250',?'$500',?'$150'],'promotion_time':?['20hr',?'30hr',?'20hr',?'20hr',?'2hr'], })output
當中的“cost”這一列帶有美元符號“$”,因此就會干擾排序的正常進行,我們使用lambda方法自定義一個函數方法運用在sort_value()當中
df.sort_values('cost',?key=lambda?val:?val.str.replace('$',?'').astype('float64') )output
當然我們還可以自定義一個更加復雜一點的函數,并且運用在sort_values()方法當中,代碼如下
def?sort_by_cost_time(x):if?x.name?==?'cost':return?x.str.replace('$',?'').astype('float64')elif?x.name?==?'promotion_time':return?x.str.replace('hr',?'').astype('int')else:return?xdf.sort_values(['year',?'promotion_time',?'cost'],?key=sort_by_cost_time )output
還有另外一種情況,例如我們遇到衣服的尺碼,XS碼、S碼、M碼、L碼又或者是月份,Jan、Feb、Mar、Apr等等,需要我們自己去定義大小,這個時候我們需要用到的是CategoricalDtype
cat_size_order?=?CategoricalDtype(['XS',?'S',?'M',?'L',?'XL'],?ordered=True ) cat_size_orderoutput
CategoricalDtype(categories=['XS',?'S',?'M',?'L',?'XL'],?ordered=True)于是針對下面的數據
df?=?pd.DataFrame({'cloth_id':?[1001,?1002,?1003,?1004,?1005,?1006],'size':?['S',?'XL',?'M',?'XS',?'L',?'S'], })output
我們將事先定義好的順序應用到該數據集當中,代碼如下
df['size']?=?df['size'].astype(cat_size_order) df.sort_values('size')output
先通過astype()來轉換數據類型,然后再進行排序。
對比Excel系列圖書累積銷量達15w冊,讓你輕松掌握數據分析技能,感興趣的同學可以直接在各大電商平臺搜索書名了解:
總結
以上是生活随笔為你收集整理的【精华总结】全文4000字、20个案例详解Pandas当中的数据统计分析与排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows LAPS 本地管理员密码
- 下一篇: 小而全的Pandas使用案例