python/pandas數據挖掘(十四)-groupby,聚合,分組級運算

来源:https://www.cnblogs.com/kungfupanda/archive/2020/05/30/12990676.html
-Advertisement-
Play Games

https://blog.csdn.net/youngbit007/article/details/54288603 groupbyimport pandas as pddf = pd.DataFrame({'key1':list('aabba'), 'key2': ['one','two','on ...


https://blog.csdn.net/youngbit007/article/details/54288603

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

————————————————
版權聲明:本文為CSDN博主「楊核桃Alvin」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/youngbit007/java/article/details/54288603


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 步驟說明: <步驟1:打開控制面板> <步驟2:設置日期,時間> 操作截圖: ...
  • 一、Ubuntu安裝: 為什麼用Ubuntu,作為伺服器初學者開發,如果真的要買蘋果系統電腦性價比不高,所以在window系統中安裝Linux虛擬機是不二之選。為什麼用Ubuntu不多說了,開始安裝吧。 以window 10 為例: 1)點擊控制面板->搜索"開發者設置"->設置開發者模式 2)點擊 ...
  • Linux 下如果我們進入到了一個比較長的路徑,比如: /home/alvin/projects/blogdemos/linux-system-programming/thread /home/alvin/projects/blogdemos/diff /home/harry/study/亞洲文化/ ...
  • linux命令tr: (Translate/ Text Replacer):可以對來自標準輸入的內容進行字元替換,字元刪除,以及重覆字元壓縮。 ***只從stdin標準輸入接收數據: 格式:tr [options] set1 set2 將輸入按照位置從set1映射到set2,然後將輸出寫到stdou ...
  • chronyd時間伺服器,和之前NTP的功能一樣,提供時間的。基礎概念我就不說了,不擅長。chronyd是NTP之後誕生的。最近下載了最新的Centos Linux 8.1,發現裡面沒有ntp服務了,百度一搜發現改為了Chronyd,這篇文章就是部署一個伺服器+客戶端測試。1、伺服器端Centos ... ...
  • 有人說安卓就是 Linux,也有人說安卓是安卓、Linux 是 Linux,兩者沒什麼關係,還有人說安卓用的是 Linux 的內核,那麼它們之間到底是什麼關係呢。要想得到這個問題的答案,我們要先弄清楚幾個概念。 Linux 與 Linux 內核 Linux 與 Linux 內核其實是不一樣的,關於這 ...
  • 當我對Docker技術還是一知半解的時候,我發現理解Docker的命令非常困難。於是,我花了幾周的時間來學習Docker的工作原理,更確切地說,是關於Docker統一文件系統(the union file system)的知識,然後回過頭來再看Docker的命令,一切變得順理成章,簡單極了。 題外話 ...
  • 1、環境準備,安裝sqlite3軟體 sudo apt-get install sqlite3 2、編寫sql執行腳本(更新操作),每條sql語句以分號結束,sql.sql文件內容: ALTER TABLE "GameDeviceInfo" ADD "Delay" INTEGER NOT NULL ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...