pandas指南-4.數據分組聚合和排序

目錄

數據分組聚合和排序

多索引

排序


數據分組聚合和排序

分組聚合非常重要,它在官方pandas文檔中有自己的部分:Groupby:split-apply-combine

import pandas as pd
pd.set_option('max_rows', 5)
import numpy as np
melbourne_data = pd.read_csv('melb_data.csv') 
melbourne_data.head()

映射map允許我們一次爲整個列轉換DataFrame或Series中的數據。 但是,我們通常希望對數據進行分組,然後對數據所在的組執行特定操作。爲此,我們可以使用groupby操作。

例如,到目前爲止我們一直在大量使用的函數是value_counts函數。 我們可以通過執行以下groupby操作來複制value_counts執行的操作:

melbourne_data.groupby('Rooms').Rooms.count()

Rooms
1      681
2     3648
      ... 
8        8
10       1
Name: Rooms, Length: 9, dtype: int64

groupby創建了一組分類,爲給定的房屋分類分配相同的點值。 然後,對於這些組中的每一組,我們計算它出現的次數。

value_counts只是此groupby操作的快捷方式。 我們可以使用我們之前使用過的任何彙總函數。 例如,要獲得每個類別中最便宜的房屋,我們可以執行以下操作:

melbourne_data.groupby('Rooms').Price.min()

Rooms
1      85000.0
2     190000.0
        ...   
8     741000.0
10    900000.0
Name: Price, Length: 9, dtype: float64
你可以將我們生成的每個組視爲我們的DataFrame的一個片段,其中僅包含值匹配的數據。 我們可以使用apply方法直接訪問此DataFrame,然後我們可以以我們認爲合適的任何方式操作數據。 例如,這裏有一種方法可以選擇數據集中每個房屋郊縣的第一個房屋的地址:

melbourne_data.groupby('Suburb').apply(lambda df: df.Address.iloc[0])

Suburb
Abbotsford         85 Turner St
Aberfeldie    2/2 St Kinnord St
                    ...        
Yarra Glen          15 Yarra St
Yarraville         13 Benbow St
Length: 314, dtype: object

對於更細粒度的控制,你還可以按多個列進行分組。 舉個例子,我們將按區域Region和郊縣Suburb挑選貴的房屋:

melbourne_data.groupby(['Regionname', 'Suburb']).apply(lambda df: df.loc[df.Price.idxmax()])

另一個值得一提的groupby方法是agg,它允許你同時在DataFrame上運行一堆不同的函數。 例如,我們可以生成數據集的簡單統計摘要,如下所示

melbourne_data.groupby(['Suburb']).Price.agg([len, min, max])

有效使用groupby將允許你使用數據集執行許多非常強大的操作。(這裏的len其實就是求分組後 每個組的記錄數目)

多索引

在我們迄今爲止看到的所有示例中,我們一直在使用具有單標籤索引的DataFrame或Series對象。 groupby略有不同,因爲根據我們運行的操作,它有時會產生所謂的多索引。

多索引與常規索引的不同之處在於它具有多個級別。 例如:

house = melbourne_data.groupby(['Regionname', 'Suburb']).Address.agg([len])
house

多索引有幾種處理其分層結構的方法,這些方法對於單級索引是不存在的。 它還需要兩個級別的標籤來檢索值。 處理多索引輸出對於剛接觸pandas的用戶來說是一個常見的“問題”。

詳細說明MultiIndex的用例以及在pandas文檔的MultiIndex / Advanced Selection部分中使用它們的詳細說明。

但是,通常你最常使用的MultiIndex方法是轉換回常規索引的方法,即reset_index方法:

house.reset_index()

排序

再看看house,我們可以看到分組按索引順序返回數據,而不是按值順序返回。 也就是說,當輸出groupby的結果時,行的順序取決於索引中的值,而不是數據中的值。

爲了獲得我們想要的數據,我們可以自己對其進行排序。 sort_values方法對此非常方便。

house = house.reset_index()
house.sort_values(by='len')

sort_values默認爲升序排序,其中最低值排在第一位。 大多數情況下,我們想要降序排序,其中較高的數字首先出現。 這樣做:

house.sort_values(by='len', ascending=False)

要按索引值排序,請使用配套方法sort_index。 此方法具有相同的參數和默認順序

house.sort_index()

最後,可以一次按多列排序:

house.sort_values(by=['Regionname', 'len'])

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章