python/pandas資料探勘(十四)-groupby,聚合,分組級運算---很全
groupby
import pandas as pd
df = pd.DataFrame({'key1':list('aabba'),
'key2': ['one','two','one','two','one'],
'data1': np.random.randn(5),
'data2': np.random.randn(5)})
df
- 1
- 2
- 3
- 4
- 5
- 6
grouped=df['data1'].groupby(df['key1']) grouped.mean()
- 1
- 2
以上的分組鍵均為Series,實際上分組鍵可以是任何長度適當的陣列
states=np.array(['Ohio','California','California','Ohio','Ohio'])
years=np.array([2005,2005,2006,2005,2006])
df['data1'].groupby([states,years]).mean()
- 1
- 2
- 3
df.groupby('key1').mean()
- 1
可以看出沒有key2列,因為df[‘key2’]不是數值資料,所以被從結果中移除。預設情況下,所有數值列都會被聚合,雖然有時可能被過濾為一個子集。
對分組進行迭代
for name, group in df.groupby('key1'):
print (name)
print (group)
- 1
- 2
- 3
可以看出name就是groupby中的key1的值,group就是要輸出的內容。
同理:
for (k1,k2),group in df.groupby(['key1','key2']):
print ('===k1,k2:')
print (k1,k2)
print ('===k3:')
print (group)
- 1
- 2
- 3
- 4
- 5
對group by後的內容進行操作,如轉換成字典
piece=dict(list(df.groupby('key1')))
piece
{'a': data1 data2 key1 key2
0 -0.233405 -0.756316 a one
1 -0.232103 -0.095894 a two
4 1.056224 0.736629 a one, 'b': data1 data2 key1 key2
2 0.200875 0.598282 b one
3 -1.437782 0.107547 b two}
piece['a']
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
groupby預設是在axis=0上進行分組的,通過設定也可以在其他任何軸上進行分組.
grouped=df.groupby(df.dtypes, axis=1)
dict(list(grouped))
{dtype('float64'): data1 data2
0 -0.233405 -0.756316
1 -0.232103 -0.095894
2 0.200875 0.598282
3 -1.437782 0.107547
4 1.056224 0.736629, dtype('O'): key1 key2
0 a one
1 a two
2 b one
3 b two
4 a one
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
選取一個或者一組列
對於大資料,很多情況是隻需要對部分列進行聚合
df.groupby(['key1','key2'])[['data2']].mean()
- 1
- 2
通過字典或者series進行分組
people=pd.DataFrame(np.random.randn(5,5),
columns=list('abcde'),
index=['Joe','Steve','Wes','Jim','Travis'])
people.ix[2:3,['b','c']]=np.nan #設定幾個nan
people
- 1
- 2
- 3
- 4
- 5
- 6
已知列的分組關係
mapping={'a':'red','b':'red','c':'blue','d':'blue','e':'red','f':'orange'}
by_column=people.groupby(mapping,axis=1)
by_column.sum()
- 1
- 2
- 3
- 4
- 5
如果不加axis=1, 則只會出現 a b c d e
Series 也一樣
map_series=pd.Series(mapping)
map_series
a red
b red
c blue
d blue
e red
f orange
dtype: object
people.groupby(map_series,axis=1).count()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
通過函式進行分組
相較於dic或者Series,python函式在定義分組關係對映時更有創意。任何被當做分組鍵的函式都會在各個索引上被呼叫一次,其返回值就會被用作分組名稱。假設你按人名的長度進行分組,僅僅傳入len即可
people.groupby(len).sum() a b c d e 3 -1.308709 -2.353354 1.585584 2.908360 -1.267162 5 -0.688506 -0.187575 -0.048742 1.491272 -0.636704 6 0.110028 -0.932493 1.343791 -1.928363 -0.364745
- 1
- 2
將函式和陣列、列表、字典、Series混合使用也不是問題,因為任何東西都會最終轉換為陣列
key_list=['one','one','one','two','two'] people.groupby([len,key_list]).sum()
- 1
根據索引級別進行分組
層次化索引最方便的地方就在於他能夠根據索引級別進行聚合。要實現該目的,通過level關鍵字出入級別編號或者名稱即可:
columns=pd.MultiIndex.from_arrays([['US','US','US','JP','JP'],[1,3,5,1,3]],names=['cty','tenor'])
hier_df=pd.DataFrame(np.random.randn(4,5),columns=columns)
hier_df
- 1
- 2
- 3
hier_df.groupby(level='cty',axis=1).count()
- 1
資料聚合
呼叫自定義的聚合函式
面向列的多函式應用
對Series或者DataFrame列的聚合運算實際是使用aggregate或者呼叫mean,std等方法。下面我們想對不同的列使用不同的聚合函式,或者一次應用多個函式
grouped=tips.groupby(['sex','smoker'])
grouped_pct=grouped['tip_pct'] #tip_pct列
grouped_pct.agg('mean')#對與9-1圖示中描述的統計,可以將函式名直接以字串傳入
#如果傳入一組函式,得到的df的列名就會以相應的函式命名
- 1
- 2
- 3
- 4
- 5
自動給出的列名辨識度低,如果傳入的是(name, function)元組組成的列表,則各個元組的第一個元素將被用作df的列名
對於df,可以定義一組用於全部列的函式,或在不同的列應用不同的函式
如果想對不同的列應用不同的函式, 具體的辦法是想agg傳入一個從列名對映到函式的字典
只有將多個函式應用到至少一列時,df才能擁有層次化的列
分組級運算和轉換
聚合只是分組運算的一種,它是資料轉換的特列。transform 和apply更牛叉.
transform會將一個函式應用到各個分組,然後將結果放在適當的位置. 如果各分組產生的標量值,則該標量值會被廣播出去。
transform也是有嚴格條件的特殊函式:傳入的函式只能產生兩種結果,要麼產生一個可以廣播的標量值(如:np.mean), 要麼產生一個相同大小的結果陣列。
people=pd.DataFrame(np.random.randn(5,5),
columns=list('abcde'),
index=['Joe','Steve','Wes','Jim','Travis'])
people
- 1
- 2
- 3
- 4
- 5
key=['one','two','one','two','one']
people.groupby(key).mean()
- 1
- 2
people.groupby(key).transform(np.mean)
- 1
可以看到有很多與表2一樣的值。
def demean(arr):
return arr-arr.mean()
demeaned=people.groupby(key).transform(demean)
demeaned
- 1
- 2
- 3
- 4
- 5
demeaned.groupby(key).mean()
- 1
最一般化的groupby 方法是apply.
tips=pd.read_csv('C:\\Users\\ecaoyng\\Desktop\\work space\\Python\\py_for_analysis_code\\pydata-book-master\\ch08\\tips.csv')
tips[:5]
- 1
- 2
新生成一列
tips['tip_pct']=tips['tip']/tips['total_bill']
tips[:6]
- 1
- 2
根據分組選出最高的5個tip_pct值
def top(df,n=5,column='tip_pct'):
return df.sort_index(by=column)[-n:]
top(tips,n=6)
- 1
- 2
- 3
對smoker分組並應用該函式
tips.groupby('smoker').apply(top)
- 1
多引數版本
tips.groupby(['smoker','day']).apply(top,n=1,column='total_bill')
- 1
分位數和桶分析
cut and qcut與groupby結合起來,能輕鬆的對資料集的桶(bucket)或者分位數(quantile)分析。
frame=pd.DataFrame({'data1':np.random.randn(1000),
'data2': np.random.randn(1000)})
frame[:5]
- 1
- 2
- 3
factor=pd.cut(frame.data1,4)
factor[:10]
0 (0.281, 2.00374]
1 (0.281, 2.00374]
2 (-3.172, -1.442]
3 (-1.442, 0.281]
4 (0.281, 2.00374]
5 (0.281, 2.00374]
6 (-1.442, 0.281]
7 (-1.442, 0.281]
8 (-1.442, 0.281]
9 (-1.442, 0.281]
Name: data1, dtype: category
Categories (4, object): [(-3.172, -1.442] < (-1.442, 0.281] < (0.281, 2.00374] < (2.00374, 3.727]]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
def get_stats(group):
return {'min':group.min(),'max':group.max(),'count':group.count(),'mean':group.mean()}
grouped=frame.data2.groupby(factor)
grouped.apply(get_stats).unstack()
- 1
- 2
- 3
- 4
這些都是長度相等的桶,要根據樣本分為數得到大小相等的桶,使用qcut即可.
長度相等的桶:區間大小相等
大小相等的桶:資料點數量相等
grouping=pd.qcut(frame.data1,10,labels=False)#label=false即可值獲取分位數的編號
grouped=frame.data2.groupby(grouping)
grouped.apply(get_stats).unstack()
- 1
- 2
- 3
相關推薦
python/pandas資料探勘(十四)-groupby,聚合,分組級運算---很全
groupby import pandas as pd df = pd.DataFrame({'key1':list('aabba'), 'key2': ['one','two','one','two','one'],
python/pandas資料探勘(十四)-groupby,聚合,分組級運算
groupby import pandas as pd df = pd.DataFrame({'key1':list('aabba'), 'key2': ['one','two','one','two','one'],
Python資料處理之(十 四)Pandas 匯入匯出
pandas可以讀取與存取的資料格式有很多種,像csv、excel、json、html與pickle等…, 詳細請看官方說明檔案 一、讀取csv 下面的例子假設當前路徑中有xxx.csv檔案: >>> import pandas as pd >>
Python+OpenCV圖像處理(十四)—— 直線檢測
gap mat rgb2gray inf 單位 imshow width 結果 pre 簡介: 1.霍夫變換(Hough Transform) 霍夫變換是圖像處理中從圖像中識別幾何形狀的基本方法之一,應用很廣泛,也有很多改進算法。主要用來從圖像中分離出具有某種相同特征的幾何
大資料學習筆記(十四)-- hadoop
Table of Contents HDFS 儲存模型 架構模型 副本佈置 總結 Hadoop簡介 HDFS 儲存模型 解釋 : 已上傳的Block大小不可改變的原因是每個Block大小一致,改變一個其他也會跟著改變
【強烈推薦】:關於系統學習資料探勘(Data Mining)的一些建議!!
微信公眾號 關鍵字全網搜尋最新排名 【機器學習演算法】:排名第一 【機器學習】:排名第一 【Python】:排名第三 【演算法】:排名第四 關於資料探勘 提到收據挖掘(Data Mining, DM),很多想學習的同學大多數都會問我: 什麼是資料探勘? 怎麼培養資料分析的能力? 如何成為一名資料科學家? (
資料探勘(機器學習)面試--SVM面試常考問題
應聘資料探勘工程師或機器學習工程師,面試官經常會考量面試者對SVM的理解。 以下是我自己在準備面試過程中,基於個人理解,總結的一些SVM面試常考問題(想到會再更新),如有錯漏,請批評指正。(大神請忽視) 轉載請註明出處:blog.csdn.net/szlcw1 SVM的原
[搬運工系列]-JMeter(十四)解讀聚合報告
一個每天1000萬PV的網站需要什麼樣的效能去支撐呢?繼續上一篇,下面我們就來計算一下,前面我們已經搞到了一票資料,但是這些資料的意義還沒有說。技術是為業務服務的,下面就來說說怎麼讓些資料變得有意義。 一、聚合報告初識聚合報告是不是有些眼熟,是的你沒看錯,他跟Apache AB的結果是類似的,事實上Load
Java(十四)--建立視窗,新增按鈕,接受事件
建立視窗的話需要引入javax.swing.*,使用了裡面的JFrame,如下 public static void main(String[] args){ JFrame frame=new JFrame("Hello World");//括號中為視
Python資料處理之(十 一)Pandas 選擇資料
首先先建立一個6X4的矩陣 >>> import pandas as pd >>> import numpy as np >>> dates=pd.date_range('20181121',periods=6) >>
Python資料處理之(十 五)Pandas 合併concat
一、要點 pandas處理多組資料的時候往往會要用到資料的合併處理,使用 concat是一種基本的合併方式.而且concat中有很多引數可以調整,合併成你想要的資料形式. 二、axis(合併方向) axis=0是預設值,因此未設定任何引數時,函式預設axis=0。 >
Python資料處理之(十 七)Pandas plot畫圖
這次我們講如何將資料視覺化. 首先import我們需要用到的模組,除了 pandas,我們也需要使用 numpy 生成一些資料,這節裡使用的 matplotlib 僅僅是用來 show 圖片的, 即 plt.show()。 import pandas as pd import num
Python資料處理之(十 六)Pandas 合併merce
要點 pandas中的merge和concat類似,但主要是用於兩組有key column的資料,統一索引的資料. 通常也被用在Database的處理當中. 依據一組key合併 import pandas as pd #定義資料集並打印出 left = pd.DataFrame({
Python資料處理之(十 三)Pandas 處理丟失資料
建立含 NaN 的矩陣 有時候我們匯入或處理資料, 會產生一些空的或者是NaN資料,如何刪除或者是填補這些 NaN 資料就是我們今天所要提到的內容. 建立了一個6X4的矩陣資料並且把兩個位置置為空. >>> dates=pd.date_range('20181
Python資料處理之(十 二)Pandas 設定值
一、建立資料 我們可以根據自己的需求, 用 pandas 進行更改資料裡面的值, 或者加上一些空的,或者有數值的列. 首先建立了一個 6X4 的矩陣資料。 >>> import pandas as pd >>> import numpy a
大資料探勘領域十大經典演算法之—CART演算法(附程式碼)
簡介 CART與C4.5類似,是決策樹演算法的一種。此外,常見的決策樹演算法還有ID3,這三者的不同之處在於特徵的劃分: ID3:特徵劃分基於資訊增益 C4.5:特徵劃分基於資訊增益比 CART:特徵劃分基於基尼指數 基本思想 CART假設決策樹是二叉樹,
資料探勘領域十大經典演算法之—樸素貝葉斯演算法(超詳細附程式碼)
簡介 NaïveBayes演算法,又叫樸素貝葉斯演算法,樸素:特徵條件獨立;貝葉斯:基於貝葉斯定理。屬於監督學習的生成模型,實現簡單,沒有迭代,並有堅實的數學理論(即貝葉斯定理)作為支撐。在大量樣本下會有較好的表現,不適用於輸入向量的特徵條件有關聯的場景。 基本思想 (1)
資料探勘領域十大經典演算法之—SVM演算法(超詳細附程式碼)
簡介 SVM(Support Vector Machine)中文名為支援向量機,是常見的一種判別方法。在機器學習領域,是一個有監督的學習模型,通常用來進行模式識別、分類以及迴歸分析。 相關概念 分類器:分類器就是給定一個樣本的資料,判定這個樣本屬於哪個類別的演算法。例如在股
【Python資料探勘課程】四.決策樹DTC資料分析及鳶尾資料集分析
希望這篇文章對你有所幫助,尤其是剛剛接觸資料探勘以及大資料的同學,同時準備嘗試以案例為主的方式進行講解。如果文章中存在不足或錯誤的地方,還請海涵~一. 分類及決策樹介紹1.分類 分類其實是從特定的資料中挖掘模式,作出判斷的過程。比如Gmail郵箱
python 入門之 – 深度copy 與 資料型別記憶體地址(十四)
在深入瞭解 python 的 copy() 方法之前先回顧以前以前學過的變數賦值,如: a = 123123 b = a print(b) 毫無疑問,在變數中我可以直接以等於號來複制一個值出來,打印出來的是和 a 相等的值,如:123123,但是在陣列中為什麼用這種方法不行,最後找