數據科學庫pandas筆記2

對於pandas來講,掌握了Series和DataFrame的基本使用後,pandas還提供了不少高階的函數與方法能夠實現更加高級的功能,使用它們能夠提升分析的效率,知足更多的需求。

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參數默認是使用平均值計算重複值的排名,即有兩個重複值排名是前兩位,那麼這兩個值的排名都是(1+2)/2=1.5
  • 當使用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
相關文章
相關標籤/搜索