官术网_书友最值得收藏!

3.2.4 數(shù)據(jù)聚合

數(shù)據(jù)聚合通常是要使每一個(gè)數(shù)組生成一個(gè)單一的數(shù)值,以便后續(xù)查看和分析結(jié)果,比如我們會(huì)查看每月的支出情況,計(jì)算當(dāng)月或每天的平均支出等。

數(shù)據(jù)聚合的一般流程如下:

1)按某字段對(duì)數(shù)據(jù)進(jìn)行分組拆分;

2)對(duì)不同組的數(shù)據(jù)應(yīng)用不同的聚合函數(shù)進(jìn)行轉(zhuǎn)換;

3)把不同組得到的結(jié)果合并起來。

總結(jié)來說,即“拆分→應(yīng)用→合并”這樣一個(gè)過程。我們可以通過groupby函數(shù)來完成此類操作,還是以前面的用戶畫像數(shù)據(jù)為例,部分?jǐn)?shù)據(jù)樣例如圖3-6所示。

圖3-6 廣告用戶畫像部分?jǐn)?shù)據(jù)樣例

例如現(xiàn)在要對(duì)System列進(jìn)行分組,計(jì)算Num列的平均值:


In [89]: grp = df.groupby('System')['Num']

In [90]: grp
Out[90]: <pandas.core.groupby.SeriesGroupBy object at 0x00000000113B8080>

可以看到grp是Python中的groupby對(duì)象,也就是說它是我們數(shù)據(jù)拆分后的中間結(jié)果。如果需要計(jì)算平均值,可直接在groupby對(duì)象grp上調(diào)用mean方法:


In [91]: grp.mean()
Out[91]:
System
android    50.120690
iOS        48.642857
Name: Num, dtype: float64

從輸出結(jié)果可以看到,System列有兩個(gè)分組,即android和iOS,以及每個(gè)分組下Num的平均值。

另外,如果需要按多個(gè)字段分組,我們可以將多個(gè)列名放到同一個(gè)list中,作為groupby的參數(shù):


In [92]: df.groupby(['System','Sex'])['Num'].mean()
Out[92]:
System   Sex
android  F      48.861111
         M      52.181818
iOS      F      40.777778
         M      60.500000
         未知    24.750000
Name: Num, dtype: float64

Pandas提供了常用的聚合函數(shù)來幫助我們進(jìn)行聚合計(jì)算,具體如表3-7所示。

表3-7 常用的聚合函數(shù)

同時(shí),我們也可以自定義聚合函數(shù),如下所示:


In [93]: def myfun(obj):
    ...:     return np.mean(obj ** 2 - 10)

In [94]: df.groupby(['System'])['Num'].apply(myfun)
Out[94]:
System
android    3338.500000
iOS        3183.738095
Name: Num, dtype: float64

通過apply函數(shù)來使用我們自定義的聚合函數(shù),可以理解為對(duì)我們拆分好的結(jié)果循環(huán)調(diào)用自定義聚合函數(shù)來進(jìn)行計(jì)算。

主站蜘蛛池模板: 若尔盖县| 连城县| 莱阳市| 南岸区| 洞口县| 吉水县| 安西县| 綦江县| 绍兴市| 五指山市| 台南县| 龙泉市| 巴塘县| 泾川县| 长治市| 大竹县| 伊金霍洛旗| 体育| 巴彦县| 庄浪县| 包头市| 永兴县| 屏山县| 自治县| 凉城县| 永靖县| 司法| 华池县| 屏东县| 临漳县| 库车县| 和硕县| 紫阳县| 枣强县| 泽州县| 华亭县| 龙里县| 安陆市| 石阡县| 天柱县| 乌兰浩特市|