首先 在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())
結果如下圖
謝謝!