zoukankan      html  css  js  c++  java
  • Python基础 | pandas基础统计

    本文示例数据下载,密码:vwy3

    import pandas as pd
    import numpy as np
    
    # 数据是之前在cnblog上抓取的部分文章信息
    df = pd.read_csv('./data/SQL测试用数据_20200325.csv',encoding='utf-8')
    
    df.head(3)
    

    单列统计

    单列单统计指标

    # 计数(不去重),不会将NaN值计算在内
    df['read_cnt'].count()
    
    # 比如我们来做个试验
    
    # 选择几个单元格,之前都是有数值的
    print(df.loc[2:4,'read_cnt'])
    
    # 然后将值设定为NaN
    df.loc[2:4,'read_cnt'] = None
    
    print(df.loc[2:4,'read_cnt'])
    
    # 看看count()结果
    print(df['read_cnt'].count())
    
    
    # 数据恢复原样
    df.loc[2:4,'read_cnt'] = [142,158,132]
    
    # 计数(去重),不会将NaN值计算在内
    # 使用nunique()方法
    df['blog_name'].nunique()
    

    常见统计指标

    • 求和 .sum()
    • 最大值 .min()
    • 最小值 .min()
    • 均值 .mean()
    • 中位数 .median()
    • 方差 .var()
    • 标准差.std()
    • 偏度 .skew()
    • 峰度 .kurtosis()
    • 百分位数 .quantile(), df.quantile(0.5)相当于中位数

    单列多统计指标

    # 求和,计数,均值
    df['read_cnt'].aggregate(func=['sum','count','mean'])
    

    多列统计

    多列相同统计指标

    # 去重计数,相当于sql中的count(distinct)
    df.nunique()
    
    df.describe() # 只对数值列有效
    
    # 选定多列同时计算多个相同的指标
    df[['href','blog_name']].aggregate(func=['nunique','count'])
    

    多列不同统计指标

    # 对blog_name字段去重计数
    # 对read_cnt计算求和、均值
    df[['blog_name','read_cnt']].aggregate(func={'blog_name':'nunique','read_cnt':['sum','mean']})
    

    分组统计

    df.groupby

    pandas groupby官方介绍

    单字段单指标

    这里的单字段是指统计用的value列

    df.groupby('weekday')['read_cnt'].nunique()
    

    单字段多指标

    df.groupby('weekday')['read_cnt'].aggregate(func=['sum','mean']).reset_index()
    
    # 多个分组字段
    df.groupby(['weekday','hour'])['read_cnt'].aggregate(func=['sum','mean']).reset_index()
    

    多字段相同指标

    # 除了分组字段外,其他字段都参与计算
    df.groupby('weekday').count().reset_index()
    
    # 指定多个字段
    # 注意多个字段要以list的格式包裹
    df.groupby('weekday')[['blog_name','date']].nunique().reset_index()
    
    # 多字段统一计算相同指标
    df.groupby('weekday').aggregate(func=['nunique','count']).reset_index()
    

    多字段不同指标

    df.groupby('weekday')[['blog_name','read_cnt']]
    .aggregate(func={'blog_name':'nunique','read_cnt':['median','mean']})
    .reset_index()
    

    df.pivot_table

    pd.pivot_table主要参数说明:

    • data 参与计算的dataframe
    • values 需要进行统计计算的列,可以是单列或多列(e.g.['col_1','col_2'])
    • index 位于左侧的维度
    • columns 位于上方的维度
    • aggfunc 统计要用的函数,可以同时对多个字段计算多个统计值,也可以对每个字段设置不同的统计指标
      • aggfunc = ['sum','np.sum','mean','count']
      • aggfunc = {'col_1':'sum','col_2':['sum','mean']}
    • fill_value缺失值设定填充值
    • margins 默认False,是否要对行和列汇总,只有设定了index参数才有效
    • dropna=True,是否删除NaN
    • margins_name='All', 汇总的行或列的名称

    df.pivot_table中的参数和pd.pivot_table保持一致

    单字段单指标

    # index和columns可以不用同时设置值
    # 对比一下两者的差异
    
    # index是将分组的字段放到统计表格的左侧
    pd.pivot_table(df, values='read_cnt'
                  ,index='weekday'
                  ,aggfunc='sum').reset_index()
    
    # columns是将制定的分组字段放到统计table的正上方
    pd.pivot_table(df, values='read_cnt'
                  ,columns='weekday'
                  ,aggfunc='sum').reset_index()
    
    # index和columns同时设定的效果
    pd.pivot_table(df, values='read_cnt'
                  ,index='hour'
                  ,columns='weekday'
                  ,aggfunc='sum').reset_index()
    

    为了便于演示计算字段(values)和统计指标(aggfunc)的操作,后续只使用index字段分组

    单字段多指标

    pd.pivot_table(df, values='read_cnt'
                  ,index='weekday'
                  ,aggfunc=['sum','mean']).reset_index()
    

    多字段相同指标

    # 对blog_name,date两个字段去重计数
    pd.pivot_table(df, values=['blog_name','date']
                  ,index='weekday'
                  ,aggfunc= lambda x :x.nunique()).reset_index()
    
    # 这里的lambda函数也可以定义为 lambda x:len(x.unique())
    

    多字段不同指标

    pd.pivot_table(df, values=['blog_name','read_cnt']
                  ,index='weekday'
                  ,aggfunc={'blog_name':lambda x: x.nunique(),'read_cnt':['sum','mean']}).reset_index()
    

    其他补充

    # 实现rollup的操作
    
    df_stat = pd.pivot_table(df, values='read_cnt'
                  ,index=['weekday']
                  ,columns='hour'
                  ,aggfunc='sum',margins=True).unstack()
    
    pd.DataFrame(df_stat).head(30)
    

    本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。

    转载请注明作者及出处

  • 相关阅读:
    游戏中的View开发
    下载更新包,并且在任务栏提示进度.
    调用android非unbind的服务中的方法(不使用bindService启动的服务)
    判断android系统中Service是否在运行的方法
    如何从Activity中调用Service中的方法
    android官方文档---应用程序基础---服务的理解(app Component---services)
    怎么通过文件名的String,找到对应的资源ID
    疯狂Java之JDBC 笔记
    android应用将json数据打包在本地,进行读取的代码
    STL 堆的使用
  • 原文地址:https://www.cnblogs.com/dataxon/p/12634911.html
Copyright © 2011-2022 走看看