“拆分-應用-合併"分組運算,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