Python pandas庫 ->groupby分組操作


首先 在SQL中 分組操作group by是對行記錄的拆分

在pandas中 分組操作groupby可以選擇對行或者列進行拆分

pandas分組之后可以根據每組的組名value(非列名)訪問部分數據 因為分組后默認以組名作為索引 groupby默認參數as_index=True

如果設置as_index=False 分組后所有的列名不變 

類似於SQL中 group by之后的having 分組列名=value

最后都是用聚合方法 合並計算數據

 1 import numpy as np
 2 import pandas as pd
 3 from pandas import DataFrame,Series
 4 df1=DataFrame({'symbol':['001','001','002','002','003'],
 5 'tdate':['201901','201902','201901','201902','201901'],
 6 'open':np.random.randint(0,50,5),
 7 'close':np.random.randint(50,100,5)})
 8 
 9 print(df1)
10 
11 grp1=df1.groupby('symbol')
12 grp2=df1.groupby(['symbol','tdate'])
13 
14 print('#可用循環語句訪問組名和每組的內容')
15 for name,group in grp1:
16     print(name)
17     print(group)
18 
19 print('#通過組名訪問數據')
20 print(grp1.get_group('001'))
21 print(grp2.get_group(('001','201901')))
22     
23 print('#計算指定列的均值 三種等價寫法')
24 print(grp1.open.mean())
25 print(grp1.open.agg('mean')) #這里函數mean要加引號 如果是自定義函數不需要
26 print(grp1.agg({'open':'mean'})) #這里指定了列名 返回DataFrame而非Series
27 
28 print('#計算指定列的指定聚合方法')
29 def my_func(x):
30     return max(x)-min(x)
31 print(grp1.open.agg(my_func))
32 print(grp1.open.agg(lambda x:max(x)-min(x))) #用匿名函數
33 
34 print('#對指定列進行計算處理')
35 print(grp1.open.apply(lambda x:x+100))

結果如下圖

 

同時 pandas可以直接對列進行拆分 設置groupby 參數axis=1即可

這個在SQL中是難以做到的

 1 import numpy as np
 2 import pandas as pd
 3 from pandas import DataFrame,Series
 4 df1=DataFrame({'symbol':['001','001','002','002','003'],
 5 'tdate':['201901','201902','201901','201902','201901'],
 6 'open':np.random.randint(0,50,5),
 7 'close':np.random.randint(50,100,5)})
 8 
 9 print(df1)
10 
11 print('#'*20)
12 
13 grp3=df1.groupby(df1.dtypes,axis=1)
14 grp4=df1.groupby({'symbol':'a','tdate':'a','open':'b','close':'b'},axis=1)
15 
16 for name,group in grp3:
17     print(name)
18     print(group)
19     
20 print('#'*20)
21 
22 for name,group in grp4:
23     print(name)
24     print(group)
25     if name=='b':
26         print('#根據組名訪問')
27         print(grp4.get_group(name))
28         print('#聚合操作')
29         print(grp4.get_group(name).mean()) 

結果如下圖

 謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM