fillna填充某一列 第三章 分組

2021-10-13 07:45:58 字數 3387 閱讀 2457

一、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,得到的是中間數,中間數與要查詢的資料進行對比 注意這裡是有序陣列 如果要查詢的資料比中間數大就在中間數的右邊,如果小就在左邊。一直迴圈,直到找到要查詢的資料或者...