利用Python进行数据分析10.2

10.2 数据聚合 Data Aggregation

  1. 使用quantile计算Serise或者是DataFrame列的样本分位数:

    1677823165261.png

    grouped=df.groupby('key1')
    grouped['data1'].quantile(0.9)
    

    1677823249984.png

    求各个分组90%的分位数,a组中90%的分位数是1.668413;b组中90%的分位数是-0.523068。

  2. 如果使用你自己的聚合函数,需要将函数传递给agg或者aggregate函数:

    def peak_to_peak(arr):
    	return arr.max()-arr.min() #自建计算组内最大值减最小值的函数
    
    grouped.agg(peak_to_peak)
    

    1677823548411.png

    根据key1做的分组,也就是将data1和data2分为a,b两组;同时key2的数据类型非数值类型,默认丢弃。

10.2.1 逐列及多函数应用

1677823805826.png

  1. 根据列day和列smoker对tips进行分组:

    grouped=tip.groupby(['day','smoker'])
    
  2. 可以使用函数名以字符串形式传递:

    grouped_pct=grouped['tip_pct']
    grouped_pct.agg("mean")
    

    1677824226420.png

    此时结果是一个Serise。

  3. 如果你传递的是函数或者是函数名的列表,那么你将获得一个列名是这些函数名的DataFrame:

grouped_pct.agg(["mean", "std", peak_to_peak])

1677825302634.png

  1. 自定义生成的DataFrame的列名:

    grouped_pct.agg([("AVE", "mean"), ("STD", np.std)])
    

    1677825430739.png

    如果你传递的是(name,founction)元组的列表,那么每个元组第一个元素将作为DataFrame的列名。

  2. 计算tip_pct和total_bill列的三个相同的统计值:

    function=['count','mean','max']
    result=grouped['tip_pct','total_bill'].agg(functions)
    result
    

    1677825634553.png

  3. 传递具有自定义名称的元组列表:

    ftuples = [("Average", "mean"), ("Variance", np.var)]
    grouped[["tip_pct", "total_bill"]].agg(ftuples)
    

    1677825735001.png

  4. 使用字典形式传递函数,从而将不同的函数应用到一个或是多个列上:

    agrouped.agg({'tip':'np.max','size':'sum'})
    

    1677825902146.png

    在tip列计算每个小组的最大值;在size列统计总数。

  5. 使用字典形式在不同的列应用不同的函数:

    grouped.agg({'tip_pct':['min','max','mean','std'],'size':'sum'})
    

    1677826205347.png

    在tip_pct列计算每个小组的最大值,最小值,均值,方差;在size列统计总数。

10.2.2 返回不含行索引的聚合数据

在grouby中使用as_index=False来禁用分组键作为索引:

tips.groupby(['day','smoker'],as_index=False).mean()

1677826447099.png

当然,也可以分完组以后,在使用reset_index()将index恢复到dataframe中:

tips.groupby(['day','smoker']).mean().reset_index()

1677826554639.png

posted @ 2023-03-03 15:05  wuhaoliu  阅读(18)  评论(0)    收藏  举报  来源