“拆分-應用-合併"分組運算,python分組技術groupby應用詳解3

“拆分-應用-合併

“拆分-應用-合併“分組運算過程,python分組技術groupby應用詳解

“拆分-應用-合併”分組運算,python分組技術groupby應用詳解2

基於上述文章,進行連載!具體如下文所示。

選取一個或一組列

對於由DataFrame產生的GroupBy物件,如果用一個(單個字串)或一組(字串陣列)列名對其進行索引,就能實現選取部分列進行聚合的目的。

In [28]: import numpy as np

。。。: import pandas as pd

。。。: from pandas import Series,DataFrame

。。。: df=DataFrame({‘key1’:[‘a’,‘a’,‘b’,‘b’,‘a’],‘key2’:[‘one’,‘two’,‘one’,‘two’,‘one’],

‘data1’:np。random。randn(5),‘data2’:np。random。randn(5)})

In [29]: df

Out[29]:

key1 key2 data1 data2

0 a one 1。523269 -0。063037

1 a two -0。368826 -0。406932

2 b one 0。753990 -1。866066

3 b two 0。602979 -1。923139

4 a one -1。712829 0。600494

In [30]: df。groupby(‘key1’)[‘data1’]

Out[30]:

In [31]: df。groupby(‘key1’)[[‘data2’]]

Out[31]:

試一下程式碼的語法糖:

In [32]: df[‘data1’]。groupby(df[‘key1’])

Out[32]:

In [33]: df[[‘data2’]]。groupby(df[‘key1’])

Out[33]:

尤其對於大資料集,很可能只需要對部分列進行聚合

In [34]: df。groupby([‘key1’,‘key2’])[[‘data2’]]。mean()

Out[34]:

data2

key1 key2

a one 0。268729

two -0。406932

b one -1。866066

two -1。923139

這種索引操作所返回的物件是一個已分組的DataFrame(如果傳入的是列表或陣列)或已分組的Series(如果傳入的是標量形式的單個列名):

In [35]: s_grouped=df。groupby([‘key1’,‘key2’])[‘data2’]

In [36]: s_grouped

Out[36]:

In [37]: s_grouped。mean()

Out[37]:

key1 key2

a one 0。268729

two -0。406932

b one -1。866066

two -1。923139

Name: data2, dtype: float64

透過字典或Series進行分組

In [38]: people=DataFrame(np。random。randn(5,5),columns=[‘a’,‘b’,‘c’,‘d’,‘e’],

index=[‘Joe’,‘Steve’,‘Wes’,‘Jim’,‘Travis’])

In [39]: people

Out[39]:

a b c d e

Joe 0。798251 -2。181076 -1。002941 -1。216847 -1。306730

Steve -0。384873 -0。712956 2。000298 -0。201616 0。618182

Wes 2。630382 0。643784 -0。609386 1。151120 -0。780954

Jim 0。226097 -0。177566 0。615332 -0。199972 -0。995759

Travis 0。283909 0。601818 -0。264502 -0。997113 0。205104

#新增幾個NA值

In [40]: people。ix[2:3,[‘b’,‘c’]]=np。nan

In [41]: people

Out[41]:

a b c d e

Joe 0。798251 -2。181076 -1。002941 -1。216847 -1。306730

Steve -0。384873 -0。712956 2。000298 -0。201616 0。618182

Wes 2。630382 NaN NaN 1。151120 -0。780954

Jim 0。226097 -0。177566 0。615332 -0。199972 -0。995759

Travis 0。283909 0。601818 -0。264502 -0。997113 0。205104

假設已知列的分組關係,並希望根據分組計算列的總計:

In [

39

]: mapping={‘a’:‘red’,‘b’:‘red’,‘c’:‘blue’,‘d’:‘blue’,‘e’:‘red’,‘f’:‘orange’}

將這個字典傳給groupby即可:

In [43]: by_column=people。groupby(mapping,axis=1)

In [44]: by_column。sum()

Out[44]:

blue red

Joe -2。219788 -2。689556

Steve 1。798682 -0。479647

Wes 1。151120 1。849428

Jim 0。415360 -0。947227

Travis -1。261615 1。090831

Series也有同樣的功能,它可以被看做一個固定大小的對映。

如果用Series作為分組鍵,則pandas會檢查Series以確保其索引跟分組軸是對齊的:

In [46]: map_series

Out[46]:

a red

b red

c blue

d blue

e red

f orange

dtype: object

In [47]: people。groupby(map_series,axis=1)。count()

Out[47]:

blue red

Joe 2 3

Steve 2 3

Wes 1 2

Jim 2 3

Travis 2 3