對於pandas來講,掌握了Series和DataFrame的基本使用後,pandas還提供了不少高階的函數與方法能夠實現更加高級的功能,使用它們能夠提升分析的效率,知足更多的需求。
依舊以一個簡單的DataFrame爲例:數組
In [161]: df Out[161]: city education top avg work_year 0 上海 本科 9 8.0 3年 1 廣州 碩士 15 11.0 2年 2 廣州 本科 12 10.0 應屆畢業生 3 北京 本科 13 12.0 2年 4 北京 本科 11 8.0 1年
下面的函數或者方法操做都是以這個DataFrame對象爲例。函數
1. 轉置方法T
這個方法能夠實現行標籤和列標籤的轉置,經常使用於矩陣運算方面。code
In [161]: df Out[161]: city education top avg work_year 0 上海 本科 9 8.0 3年 1 廣州 碩士 15 11.0 2年 2 廣州 本科 12 10.0 應屆畢業生 3 北京 本科 13 12.0 2年 4 北京 本科 11 8.0 1年 In [162]: df.T Out[162]: 0 1 2 3 4 city 上海 廣州 廣州 北京 北京 education 本科 碩士 本科 本科 本科 top 9 15 12 13 11 avg 8 11 10 12 8 work_year 3年 2年 應屆畢業生 2年 1年
2. 排序與排名
pandas中的排序有兩種,一種是對行或者列索引(sort_index
)進行排序,另一種是按值對一列即Series對象(sort_values
)進行排序。對象
首先從經常使用的sort_values函數開始,當但願對一個DataFrame進行排序的時候,將一個列或者多個列傳遞給by參數便可。排序
In [164]: df Out[164]: city education top avg work_year 0 上海 本科 9 8.0 3年 1 廣州 碩士 15 11.0 2年 2 廣州 本科 12 10.0 應屆畢業生 3 北京 本科 13 12.0 2年 4 北京 本科 11 8.0 1年 In [165]: df.sort_values(by='avg') # 根據avg進行排序,默認是升序 Out[165]: city education top avg work_year 0 上海 本科 9 8.0 3年 4 北京 本科 11 8.0 1年 2 廣州 本科 12 10.0 應屆畢業生 1 廣州 碩士 15 11.0 2年 3 北京 本科 13 12.0 2年
sort_values()函數默認是升序排序,若是想改成降序排序,只要將ascending
參數設置爲False便可。索引
In [166]: df.sort_values(by='avg',ascending=False) Out[166]: city education top avg work_year 3 北京 本科 13 12.0 2年 1 廣州 碩士 15 11.0 2年 2 廣州 本科 12 10.0 應屆畢業生 0 上海 本科 9 8.0 3年 4 北京 本科 11 8.0 1年
除了根據一列進行排序外,還能夠根據多列進行排序,多列排序時傳遞給by參數的是一個包含多個列索引的列表。ci
In [168]: df.sort_values(by=['avg','city']) Out[168]: city education top avg work_year 0 上海 本科 9 8.0 3年 4 北京 本科 11 8.0 1年 2 廣州 本科 12 10.0 應屆畢業生 1 廣州 碩士 15 11.0 2年 3 北京 本科 13 12.0 2年
而基於行索引或者列索引的排序使用sort_index()函數pandas
In [171]: df.index = ['d','a','c','b','e'] # 將行索引改成d,a,c,b,e In [172]: df Out[172]: city education top avg work_year d 上海 本科 9 8.0 3年 a 廣州 碩士 15 11.0 2年 c 廣州 本科 12 10.0 應屆畢業生 b 北京 本科 13 12.0 2年 e 北京 本科 11 8.0 1年 In [173]: df.sort_index() # 根據行索引進行排序 Out[173]: city education top avg work_year a 廣州 碩士 15 11.0 2年 b 北京 本科 13 12.0 2年 c 廣州 本科 12 10.0 應屆畢業生 d 上海 本科 9 8.0 3年 e 北京 本科 11 8.0 1年
進行排序以後,你有可能會關心排名,好比這個學生的成績排名第幾。pandas提供了rank函數來計算排名,排名會從1開始一直到數組中有效數據的數量。it
In [9]: df.avg.rank() # 根據avg的值進行排名 Out[9]: 0 1.5 1 4.0 2 3.0 3 5.0 4 1.5 Name: avg, dtype: float64 In [10]: df['rank'] = df.avg.rank() # 賦值進數據框,觀看友好一點 In [11]: df Out[11]: city education top avg work_year rank 0 上海 本科 9 8.0 3年 1.5 1 廣州 碩士 15 11.0 2年 4.0 2 廣州 本科 12 10.0 應屆畢業生 3.0 3 北京 本科 13 12.0 2年 5.0 4 北京 本科 11 8.0 1年 1.5
默認是升序排名,改成降序使用ascending=False
參數便可。當排名的值有重複值的時候,rank()函數還提供了method參數,選用不一樣參數有不一樣的排名方法。io
method='max'
的時候,重複值會使用最大值的排名,若有4個90分排名1,2,3,4名,那麼這四個90的排名都是第四名method='min'
的時候,重複值會使用最小值的排名,如4個90分排名1,2,3,4名,那麼這四個90分的排名都是第一名,第5個分數排名第五名method='first'
的時候,重複值的行索引小的會排在前面。In [14]: df['rank'] = df.avg.rank(ascending=False,method='max') In [15]: df Out[15]: city education top avg work_year rank 0 上海 本科 9 8.0 3年 5.0 1 廣州 碩士 15 11.0 2年 2.0 2 廣州 本科 12 10.0 應屆畢業生 3.0 3 北京 本科 13 12.0 2年 1.0 4 北京 本科 11 8.0 1年 5.0 In [16]: df['rank'] = df.avg.rank(ascending=False,method='min') In [17]: df Out[17]: city education top avg work_year rank 0 上海 本科 9 8.0 3年 4.0 1 廣州 碩士 15 11.0 2年 2.0 2 廣州 本科 12 10.0 應屆畢業生 3.0 3 北京 本科 13 12.0 2年 1.0 4 北京 本科 11 8.0 1年 4.0 In [18]: df['rank'] = df.avg.rank(ascending=False,method='first') In [19]: df Out[19]: city education top avg work_year rank 0 上海 本科 9 8.0 3年 4.0 1 廣州 碩士 15 11.0 2年 2.0 2 廣州 本科 12 10.0 應屆畢業生 3.0 3 北京 本科 13 12.0 2年 1.0 4 北京 本科 11 8.0 1年 5.0
3. 惟一值與值計數
pandas中提供了一些函數提取Series中的信息,第一個函數是unique()
,它能夠獲得Series中的惟一值數組。第二個是value_counts()
它用於計算一個Series中各個值出現的次數。
In [20]: df Out[20]: city education top avg work_year rank 0 上海 本科 9 8.0 3年 4.0 1 廣州 碩士 15 11.0 2年 2.0 2 廣州 本科 12 10.0 應屆畢業生 3.0 3 北京 本科 13 12.0 2年 1.0 4 北京 本科 11 8.0 1年 5.0 In [21]: df.city.unique() Out[21]: array(['上海', '廣州', '北京'], dtype=object) In [22]: df.city.value_counts() # 廣州出現次數爲2,北京爲2,上海爲1 Out[22]: 廣州 2 北京 2 上海 1 Name: city, dtype: int64
4. 描述統計信息的彙總
describe()函數用於一次性產生多個彙總統計:
In [23]: df.describe() Out[23]: top avg rank count 5.000000 5.000000 5.000000 # 計數 mean 12.000000 9.800000 3.000000 # 平均數 std 2.236068 1.788854 1.581139 # 標準差 min 9.000000 8.000000 1.000000 # 最小值 25% 11.000000 8.000000 2.000000 50% 12.000000 10.000000 3.000000 # 中位數 75% 13.000000 11.000000 4.000000 # 衆數 max 15.000000 12.000000 5.000000 # 最大值
cumsum用於累加,如想要計算avg的值的累加:
In [25]: df Out[25]: city education top avg work_year rank 0 上海 本科 9 8.0 3年 4.0 1 廣州 碩士 15 11.0 2年 2.0 2 廣州 本科 12 10.0 應屆畢業生 3.0 3 北京 本科 13 12.0 2年 1.0 4 北京 本科 11 8.0 1年 5.0 In [26]: df.avg.cumsum() Out[26]: 0 8.0 1 19.0 2 29.0 3 41.0 4 49.0 Name: avg, dtype: float64 In [27]: df['avg_sum'] = df.avg.cumsum() In [28]: df Out[28]: city education top avg work_year rank avg_sum 0 上海 本科 9 8.0 3年 4.0 8.0 1 廣州 碩士 15 11.0 2年 2.0 19.0 2 廣州 本科 12 10.0 應屆畢業生 3.0 29.0 3 北京 本科 13 12.0 2年 1.0 41.0 4 北京 本科 11 8.0 1年 5.0 49.0
對數據進行分段,能夠根據數據進行等分,好比根據top數值將數據進行5等分。cut函數是在pandas下,而不是在DataFrame下,使用須要注意。
In [30]: pd.cut(df.top,bins=5) Out[30]: 0 (8.994, 10.2] 1 (13.8, 15.0] 2 (11.4, 12.6] 3 (12.6, 13.8] 4 (10.2, 11.4] Name: top, dtype: category Categories (5, interval[float64]): [(8.994, 10.2] < (10.2, 11.4] < (11.4, 12.6] < (12.6, 13.8] < (13.8, 15.0]] In [31]: df['bins'] = pd.cut(df.top,bins=5) In [32]: df Out[32]: city education top ... rank avg_sum bins 0 上海 本科 9 ... 4.0 8.0 (8.994, 10.2] 1 廣州 碩士 15 ... 2.0 19.0 (13.8, 15.0] 2 廣州 本科 12 ... 3.0 29.0 (11.4, 12.6] 3 北京 本科 13 ... 1.0 41.0 (12.6, 13.8] 4 北京 本科 11 ... 5.0 49.0 (10.2, 11.4] [5 rows x 8 columns]
cut函數還有個參數是labels,這個參數是標籤,生活中相似於把90分以上的分爲優秀,70~80分的爲良好。能夠把在某個檔次的數據標記各自的標籤。
In [34]: df['labels'] = pd.cut(df.top,bins=5,labels=list('abcde')) In [35]: df Out[35]: city education top avg work_year rank avg_sum bins labels 0 上海 本科 9 8.0 3年 4.0 8.0 (8.994, 10.2] a 1 廣州 碩士 15 11.0 2年 2.0 19.0 (13.8, 15.0] e 2 廣州 本科 12 10.0 應屆畢業生 3.0 29.0 (11.4, 12.6] c 3 北京 本科 13 12.0 2年 1.0 41.0 (12.6, 13.8] d 4 北京 本科 11 8.0 1年 5.0 49.0 (10.2, 11.4] b