一、sac過程
1. 內涵
在該過程中,我們實際往往會遇到四類問題:
整合(aggregation)——即分組計算統計量(如求均值、求每組元素個數)
變換(transformation)——即分組對每個單元的資料進行操作(如元素標準化)
過濾(filtration)——即按照某些規則篩選出一些組(如選出組內某一指標小於50的組)
綜合問題——即前面提及的三種問題的混合
二、groupby函式
1. 分組函式的基本內容:
1)根據某一列分組:
grouped_single = df.groupby('school')
經過groupby後會生成乙個groupby物件,該物件本身不會返回任何值,只有當相應的方法呼叫才會起作用,例如取出某乙個組:grouped_single.get_group('s_1')
2)根據某幾列分組:
grouped_mul = df.groupby(['school','class'])
3)組容量與組數:
grouped_single.size()
grouped_single.ngroups
4)組的遍歷
for name,group in grouped_single:
print(name)
display(group.head())
5)level引數(用於多級索引)和axis引數
df.set_index(['gender','school']).groupby(level=1,axis=0).get_group('s_1')
2. groupby物件的特點
1)可以使用相當多的函式,靈活程度很高
2)對分組物件使用head函式,返回的是每個組的前幾行,而不是資料集前幾行,first類似
3)分組依據非常自由,只要是與資料框長度相同的列表即可,同時支援函式型分組:
df.groupby(np.random.choice(['a','b','c'],df.shape[0])).get_group('b')
根據奇偶行分組:
df.groupby(lambda x:'奇數行' if df.index.get_loc(x)%2==0 else '偶數行').groups
4)groupby的操作
可以用選出groupby物件的某個或某幾個列並實現一些聚合操作,例如:
df.groupby(['gender','school'])['math'].mean()
5)連續型變數分組
用cut函式進行分組:
bins = [0,40,60,80,90,100]
cuts = pd.cut(df['math'],bins=bins) #可選label新增自定義標籤
df.groupby(cuts)['math'].count()
三、聚合、過濾和交換
1. 聚合(aggregation)
1)常用聚合函式
所謂聚合就是把一堆數,變成乙個標量,因此mean/sum/size/count/std/var/sem/describe/first/last/nth/min/max都是聚合函式
可以指定哪些函式作用哪些列:
grouped_mul.agg()
2)可以使用自定義函式:
grouped_single['math'].agg(lambda x:x.max()-x.min())
2.過濾
filter函式是用來篩選某些組的,因此傳入的值應當是布林標量:
grouped_single[['math','physics']].filter(lambda x:(x['math']>32).all())
3.變換
1)傳入物件:
transform函式中傳入的物件是組內的列,並且返回值需要與列長完全一致:
grouped_single[['math','height']].transform(lambda x:x-x.min())
如果返回了標量值,那麼組內的所有元素會被廣播為這個值
2)利用變換方法進行組內標準化
grouped_single[['math','height']].transform(lambda x:(x-x.mean())/x.std())
3)利用變換方法進行組內缺失值均值填充:
df_nan.groupby('school').transform(lambda x: x.fillna(x.mean()))
返回值為標量:
返回值為列表:
返回值為資料框:
df[['school','math','height']].groupby('school')\
'col2':x['math']-x['math'].min(),
'col3':x['height']-x['height'].max(),
'col4':x['height']-x['height'].min()}))
可以借助ordereddict工具進行快捷的統計:
from collections import ordereddict
def f(df):
data = ordereddict()
data['m_sum'] = df['math'].sum()
data['w_var'] = df['weight'].var()
data['h_mean'] = df['height'].mean()
return pd.series(data)
問題與練習:
【問題一】 什麼是fillna的前向/後向填充,如何實現?
向前填充就有一列裡有空值的時候,用後面的第乙個值填充前面的空值,fillna(method='bfill')
向後填充則反過來用前面的值填充後面的空值,fillna(method='ffill')
【問題二】 下面的**實現了什麼功能?請仿照設計乙個它的groupby版本。
s = pd.series ([0, 1, 1, 0, 1, 1, 1, 1,0,0])
s1 = s.cumsum()
result = s.mul(s1).diff().where(lambda x: x < 0).ffill().add(s1,fill_value =0)
【問題三】 如何計算組內0.25分位數與0.75分位數?要求顯示在同一張表上。
示例如下:
【問題四】 既然索引已經能夠選出某些符合條件的子集,那麼filter函式的設計有什麼意義?
filter函式更適用於篩選符合某些條件的組,而索引在分組的場合下不太適用
【問題五】 整合、變換、過濾三者在輸入輸出和功能上有何異同?
聚合是把多條資料聚合成一條資料,例如計算平均值、最大值、方差等
變換則是對每條資料都進行相應的操作,資料原來的維度不變
而過濾是篩選出符合條件的資料
第三章 如何填充缺失值
有乙個訓練集train,想要用它來訓練模型並且來進行測試,所以我們要把它分為訓練集和測試集。假如我們的資料集裡面有乙個缺失值,那麼我們應該如何填充這個缺失值。假如我們先填充資料集然後再把資料分為訓練集和測試集,那麼這個時候出現乙個違反原則的事情 我們用的訓練集的資料竟然有一部分來自測試集,哈哈,但是...
第三章 OSPF(一)
3.1 ospf的基本概念 ospf open shortest path first 開放式最短路徑優先協議是典型的鏈路狀態協議,支援vlsm 可變長子網掩碼 支援路由彙總等,另外區域 area 的引入使得ospf能夠支援更大規模的網路。ospf現在主要有兩個版本,乙個是面向ipv4的ospfv2...
第三章 二分查詢
今天要學習的是二分查詢。1.介紹 二分查詢跟歸併與快排一樣都採用了分治思想,它是在乙個有序陣列中查詢資料。2.方法 將乙個陣列的下標除以2,得到的是中間數,中間數與要查詢的資料進行對比 注意這裡是有序陣列 如果要查詢的資料比中間數大就在中間數的右邊,如果小就在左邊。一直迴圈,直到找到要查詢的資料或者...