感謝datawhale開展的每月組隊學習,教材ref:第四章:分組
分組模式及其物件
分組的一般模式

分組依據的本質

🔫 練一練
請根據上下四分位數分割,將體重分為high、normal、low三組,統計身高的均值,
計算三分位的邊界在哪里
weight_tertile = list(df.Weight.quantile([.33, .66]))
確定分組依據
我們可以寫一個function去把Weight轉換成 low,normal和high,根據我們上面得到的分位數邊界
- 普通function寫法(因為我lambda用的不是很熟練,先普通func寫出來可以幫助縷一下思路
def split_weight(x): if x <= weight_tertile[0]: return "low" if x <= weight_tertile[1]: return "normal" return "hight"
- lambda 寫法
lambda x: "low" if x<=weight_tertile[0] else ("normal" if x<=weight_tertile[1] else "hight")資料來源:[‘Height’]
操作及其回傳結果:平均值# 請根據上下四分位數分割,將體重分為high、normal、low三組,統計身高的均值, # lambda df.groupby(df.Weight.apply(lambda x: "low" if x<=weight_tertile[0] else ("normal" if x<=weight_tertile[1] else "hight")))['Height'].mean() # self-defined func df.groupby(df.Weight.apply(split_weight))['Height'].mean()
有個有點愚蠢的問題,分三份的話應該斷開兩下對吧?那位置應該在33.33333%和66.666666%?
Groupby object

🔫 練一練
上一小節介紹了可以通過 drop_duplicates 得到具體的組類別,現請用 groups 屬性完成類似的功能,
直接把zzg
分組的三大操作

聚合函式
內置聚合函式

agg方法

🔫 練一練
請使用【b】中的傳入字典的方法完成【a】中等價的聚合任務,
gb.agg({'Height':['sum','idxmax','skew'], 'Weight':['sum','idxmax','skew']})
變換 和 過濾
變換函式 和 transform method

我怎么感覺transform和apply一樣的
組索引與過濾

跨列分組

🔫 練一練
在 groupby 物件中還定義了 cov 和 corr 函式,從概念上說也屬于跨列的分組處理,請利用之前定義的 gb 物件,使用apply函式實作與 gb.cov() 同樣的功能并比較它們的性能,
練習
Ex1:汽車資料集
現有一份汽車資料集,其中 Brand, Disp., HP 分別代表汽車品牌、發動機蓄量、發動機輸出,
In [45]: df = pd.read_csv('data/car.csv')
In [46]: df.head(3)
Out[46]:
Brand Price Country Reliability Mileage Type Weight Disp. HP
0 Eagle Summit 4 8895 USA 4.0 33 Small 2560 97 113
1 Ford Escort 4 7402 USA 2.0 33 Small 2345 114 90
2 Ford Festiva 4 6319 Korea 4.0 37 Small 1845 81 63
-
先過濾出所屬
Country數超過2個的汽車,即若該汽車的Country在總體資料集中出現次數不超過2則剔除,再按Country分組計算價格均值、價格變異系數、該Country的汽車數量,其中變異系數的計算方法是標準差除以均值,并在結果中把變異系數重命名為CoV,先處理一下問題的前半部分吧,按country來分組,可以稍微看一下

用groupby object 的 filter method去把個數大于2 的取出來car_df.groupby('Country').filter(lambda x: x.shape[0]>2)回傳的結果 – 未被過濾的組對應的每一行重新拼起來成為一個dataframe
那我們就接著對這個dataframe(給名字 filtered_df)繼續做后半部分操作filted_df.groupby('Country')['Price'].agg(['mean', ('Cov', lambda x: x.std()/x.mean()), 'count'])
-
按照表中位置的前三分之一、中間三分之一和后三分之一分組,統計
Price的均值,divide = ['First']*20+['Second']*20+['Last']*20 car_df.groupby(divide)['Price'].mean() -
對型別
Type分組,對Price和HP分別計算最大值和最小值,結果會產生多級索引,請用下劃線把多級列索引合并為單層索引,temp = car_df.groupby('Type').agg({'Price':'max', 'HP':'min'}) temp.columns = ['Price_max', 'HP_min']
-
對型別
Type分組,對HP進行組內的min-max歸一化,def normalize(x): min_val, max_val = min(x), max(x) res = (x - min_val)/(max_val - min_val) return res car_df.groupby('Type')['HP'].apply(normalize) -
對型別
Type分組,計算Disp.與HP的相關系數,car_df.groupby('Type')['Disp.','HP'].apply(lambda x:np.corrcoef(x['HP'].values, x['Disp.'].values)[0,1])
Ex2: 實作transform函式
groupby物件的構造方法是my_groupby(df, group_cols)- 支持單列分組與多列分組
- 支持帶有標量廣播的
my_groupby(df)[col].transform(my_func)功能 pandas的transform不能跨列計算,請支持此功能,即仍回傳Series但col引數為多列- 無需考慮性能與例外處理,只需實作上述功能,在給出測驗樣例的同時與
pandas中的transform對比結果是否一致唉transform好像還沒有搞得很清楚
dei不起
我放棄了
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/240543.html
標籤:python






