• 转载,Pandas 数据统计用法


    pandas模块为我们提供了非常多的描述性统计分析的指标函数,如总和、均值、最小值、最大值等,我们来具体看看这些函数:

    1、随机生成三组数据
    import numpy as np
    import pandas as pd

    np.random.seed(1234)
    d1 = pd.Series(2*np.random.normal(size = 100)+3)
    d2 = np.random.f(2,4,size = 100)
    d3 = np.random.randint(1,100,size = 100)
    1
    2
    3
    4
    5
    6
    7
    2、统计分析用到的函数
    d1.count() #非空元素计算
    d1.min() #最小值
    d1.max() #最大值
    d1.idxmin() #最小值的位置,类似于R中的which.min函数
    d1.idxmax() #最大值的位置,类似于R中的which.max函数
    d1.quantile(0.1) #10%分位数
    d1.sum() #求和
    d1.mean() #均值
    d1.median() #中位数
    d1.mode() #众数
    d1.var() #方差
    d1.std() #标准差
    d1.mad() #平均绝对偏差
    d1.skew() #偏度
    d1.kurt() #峰度
    d1.describe() #一次性输出多个描述性统计指标
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    必须注意的是,descirbe方法只能针对序列或数据框,一维数组是没有这个方法的
    自定义一个函数,将这些统计指标汇总在一起:

    def status(x) :
    return pd.Series([x.count(),x.min(),x.idxmin(),x.quantile(.25),x.median(),
    x.quantile(.75),x.mean(),x.max(),x.idxmax(),x.mad(),x.var(),
    x.std(),x.skew(),x.kurt()],index=['总数','最小值','最小值位置','25%分位数',
    '中位数','75%分位数','均值','最大值','最大值位数','平均绝对偏差','方差','标准差','偏度','峰度'])
    1
    2
    3
    4
    5
    执行该函数,查看一下d1数据集的这些统计函数值:

    df = pd.DataFrame(status(d1))
    df
    1
    2
    结果:


    在实际的工作中,我们可能需要处理的是一系列的数值型数据框,如何将这个函数应用到数据框中的每一列呢?可以使用apply函数,这个非常类似于R中的apply的应用方法。
    将之前创建的d1,d2,d3数据构建数据框:

    df = pd.DataFrame(np.array([d1,d2,d3]).T, columns=['x1','x2','x3'])
    df.head()

    df.apply(status)
    1
    2
    3
    4
    结果:


    3、加载CSV数据
    import numpy as np
    import pandas as pd

    bank = pd.read_csv("D://bank/bank-additional-train.csv")
    bank.head() #查看前5行
    1
    2
    3
    4
    5


    描述性统计1:describe()
    result = bank['age'].describe()
    pd.DataFrame(result ) #格式化成DataFrame
    1
    2


    描述性统计2:describe(include=[‘number’])
    include中填写的是数据类型,若想查看所有数据的统计数据,则可填写object,即include=['object'];若想查看float类型的数据,则为include=['float']。
    1
    result = bank.describe(include=['object'])
    1

    含义:

    count:指定字段的非空总数。
    unique:该字段中保存的值类型数量,比如性别列保存了男、女两种值,则unique值则为2。
    top:数量最多的值。
    freq:数量最多的值的总数。
    bank.describe(include=['number'])
    1


    连续变量的相关系数(corr)
    bank.corr()
    1


    协方差矩阵(cov)
    bank.cov()
    1


    删除列
    bank.drop('job', axis=1) #删除年龄列,axis=1必不可少
    1
    排序
    bank.sort_values(by=['job','age']) #根据工作、年龄升序排序
    bank.sort_values(by=['job','age'], ascending=False) #根据工作、年龄降序排序
    1
    2
    多表连接
    准备数据:
    import numpy as np
    import pandas as pd

    student = {'Name':['Bob','Alice','Carol','Henry','Judy','Robert','William'],
    'Age':[12,16,13,11,14,15,24],
    'Sex':['M','F','M','M','F','M','F']}

    score = {'Name':['Bob','Alice','Carol','Henry','William'],
    'Score':[75,35,87,86,57]}

    df_student = pd.DataFrame(student)
    df_student

    df_score = pd.DataFrame(score)
    df_score
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    student:


    score:


    内连接
    stu_score1 = pd.merge(df_student, df_score, on='Name')
    stu_score1
    1
    2
    注意,默认情况下,merge函数实现的是两个表之间的内连接,即返回两张表中共同部分的数据。可以通过how参数设置连接的方式,left为左连接;right为右连接;outer为外连接。


    左连接
    stu_score2 = pd.merge(df_student, df_score, on='Name',how='left')
    stu_score2
    1
    2


    左连接中,没有Score的学生Score为NaN
    缺失值处理
    现实生活中的数据是非常杂乱的,其中缺失值也是非常常见的,对于缺失值的存在可能会影响到后期的数据分析或挖掘工作,那么我们该如何处理这些缺失值呢?常用的有三大类方法,即删除法、填补法和插值法。

    删除法
    当数据中的某个变量大部分值都是缺失值,可以考虑删除改变量;当缺失值是随机分布的,且缺失的数量并不是很多是,也可以删除这些缺失的观测。

    替补法
    对于连续型变量,如果变量的分布近似或就是正态分布的话,可以用均值替代那些缺失值;如果变量是有偏的,可以使用中位数来代替那些缺失值;对于离散型变量,我们一般用众数去替换那些存在缺失的观测。

    插补法
    插补法是基于蒙特卡洛模拟法,结合线性模型、广义线性模型、决策树等方法计算出来的预测值替换缺失值。

    此处测试使用上面学生成绩数据进行处理
    查询某一字段数据为空的数量
    sum(pd.isnull(stu_score2['Score']))
    结果:2
    1
    2
    直接删除缺失值
    stu_score2.dropna()
    1
    删除前:

    删除后:


    默认情况下,dropna会删除任何含有缺失值的行
    删除所有行为缺失值的数据
    import numpy as np
    import pandas as pd

    df = pd.DataFrame([[1,2,3],[3,4,np.nan],
    [12,23,43],[55,np.nan,10],
    [np.nan,np.nan,np.nan],[np.nan,1,2]],
    columns=['a1','a2','a3'])
    1
    2
    3
    4
    5
    6
    7


    df.dropna() #该操作会删除所有有缺失值的行数据
    1


    df.dropna(how='all') #该操作仅会删除所有列均为缺失值的行数据
    1


    填充数据
    使用一个常量来填补缺失值,可以使用fillna函数实现简单的填补工作:

    1、用0填补所有缺失值
    df.fillna(0)
    1


    2、采用前项填充或后向填充
    df.fillna(method='ffill') #用前一个值填充
    1


    df.fillna(method='bfill') #用后一个值填充
    1


    3、使用常量填充不同的列
    df.fillna({'a1':100,'a2':200,'a3':300})
    1


    4、用均值或中位数填充各自的列
    a1_median = df['a1'].median() #计算a1列的中位数
    a1_median=7.5

    a2_mean = df['a2'].mean() #计算a2列的均值
    a2_mean = 7.5

    a3_mean = df['a3'].mean() #计算a3列的均值
    a3_mean = 14.5

    df.fillna({'a1':a1_median,'a2':a2_mean,'a3':a3_mean}) #填充值
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10


    很显然,在使用填充法时,相对于常数填充或前项、后项填充,使用各列的众数、均值或中位数填充要更加合理一点,这也是工作中常用的一个快捷手段。
    数据打乱(shuffle)
    实际工作中,经常会碰到多个DataFrame合并后希望将数据进行打乱。在pandas中有sample函数可以实现这个操作。

    df = df.sample(frac=1)
    1
    这样对可以对df进行shuffle。其中参数frac是要返回的比例,比如df中有10行数据,我只想返回其中的30%,那么frac=0.3。
    有时候,我们可能需要打混后数据集的index(索引)还是按照正常的排序。我们只需要这样操作

    df = df.sample(frac=1).reset_index(drop=True)
    ————————————————
    版权声明:本文为CSDN博主「T_白日梦想家」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/A632189007/java/article/details/76176985

  • 相关阅读:
    JAVA访问权限控制[zhuan]
    Netstat简介
    查看cpu性能和磁盘空间
    简单linux查询
    linux 三剑客命令(grep,sed ,awk)
    同步、异步的使用场景及好处
    AJAX中同步和异步的区别和使用场景
    在SpringBoot中用SpringAOP实现日志记录功能
    springboot使用@Aspect实现AOP记录日志讲解
    Spring:获取容器中的Bean
  • 原文地址:https://www.cnblogs.com/wellons/p/13208775.html
Copyright © 2020-2023  润新知