zoukankan      html  css  js  c++  java
  • Pandas(二)描述统计与函数应用

     一、描述与统计

    1.查看基本统计值

    有时候我们获取到数据之后,想要查看下数据的简单统计指标(最大值、最小值、平均值、中位数等),比如想要查看年龄的最大值,如何实现呢?

    直接对 age 这一列调用 max方法即可。类似的,通过调用 min、mean、quantile、sum 方法可以实现最小值、平均值、中位数以及求和。可以看到,对一个 Series 调用 这几个方法之后,返回的都只是一个聚合结果。

    #函数
    np.max(user_info.年龄)

    #方法
    user_info.年龄.mean()

    如果想要获取更多的统计方法,可以参见官方链接:Descriptive statistics (http://pandas.pydata.org/pandas-docs/stable/basics.html#descriptive-statistics)

    虽然说常见的各种统计值都有对应的方法,如果我想要得到多个指标的话,就需要调用多次方法,是不是显得有点麻烦呢?Pandas 设计者自然也考虑到了这个问题,想要一次性获取多个统计指标,只需调用 describe 方法即可。

    # 只支持数值列
    user_info.describe()

    可以看到,直接调用 describe 方法后,会显示出数字类型的列的一些统计指标,如 总数、平均数、标准差、最小值、最大值、25%/50%/75% 分位数。

    如果想要查看非数字类型的列的统计指标,可以设置 include=["object"] 来获得。

    user_info.describe(include=["float64"])

    2.统计下某列中每个值出现的次数value_counts

    user_info['中青年'].value_counts()
    
    user_info.性别.value_counts()

    这个非常重要,后面会经常用到。

    3.离散化

    有时候,我们会碰到这样的需求,想要将年龄进行离散化(分桶),直白来说就是将年龄分成几个区间,这里我们想要将年龄分成 3 个区间段。就可以使用 Pandas 的 cut 方法来完成。

    # bins 整数,代表了均匀切分,等宽分箱
    pd.cut(grade.语文,3)

    
    

    #有时候离散化之后,想要给每个区间起个名字,可以指定 labels 参数
    pd.cut(grade.语文,3,labels=['低分','中等','高分'])

    可以看到, cut 自动生成了等距的离散区间,如果自己想定义也是没问题的。

    # bins 如果是一个序列, 代表指定切分位置
    # 0-60   60 - 100  100 - 150
    # right = False  代表左侧闭区间 ,右侧开区间
    pd.cut(grade.数学 , [-1 , 60 , 100, 151] , right =False )

    除了可以使用 cut 进行离散化之外,qcut 也可以实现离散化。cut 是根据每个值的大小来进行离散化的,qcut 是根据每个值出现的次数来进行离散化的。有时候等宽分箱,当样本分布不是很均匀的时候,结果不是很好,换成等深分箱,这样切分出的样本数是差不多的。

    # pd.qcut 等深分箱  , 保证分箱之后的区间中样本个数大体相等
    pd.qcut(grade.语文, 3)
    pd.qcut(grade.语文, 3).value_counts()

    4.排序功能

    在进行数据分析时,少不了进行数据排序。Pandas 支持两种排序方式:按轴(索引或列)排序和按实际值排序。

    1)按索引排序

    sort_index 方法默认是按照索引进行正序排的。

    2)按值排序

    如果想要实现按照实际值来排序,例如想要按照年龄排序,如何实现呢?

    使用 sort_values 方法,设置参数 by="***" 即可。

    # 降序排序
    eng.sort_values(ascending=False)
    # 按照英语进行排序
    grade.sort_values(by = '英语' , ascending=False)

    有时候我们可能需要按照多个值来排序,例如:按照年龄和城市来一起排序,可以设置参数 by 为一个 list 即可。注意:list 中每个元素的顺序会影响排序优先级的.

    # 按照英语进行排序 , 英语分数相同的, 以数学进行排序
    grade.sort_values(by =[ '英语', '数学'] , ascending=False)

    二、函数应用

     1.map

    map函数非常重要,学好了,半壁江山就拿下了。

     

    map()函数是python内置的高阶函数,对传入的list的每一个元素进行映射,返回一个新的映射之后的list

    python3中,map函数返回的是一个map对象,需要list(map(fun,itor))来将映射之后的map对象转换成列表

     2.applymap

    applymap 方法针对于 DataFrame,它作用于 DataFrame 中的每个元素,它对 DataFrame 的效果类似于 apply 对 Series 的效果。

    def f(x):
    #     print(type(x))
    #     print(x)
    #     print("-----")
        if type(x) == int: # 传进来的是数值
            return x * 2
        elif type(x) == str:
            return x * 3
    grade3 = grade[['语文','姓氏']]
    grade3
    
    grade3.applymap(f)

    三、表合并

    # 直接在后面追加新的数据
    grade_one.append(grade_two)
    # 一次性拼接多个表, 使用新的索引
    grade_one.append(  [grade_two , grade_one ,grade_two] ,
                     ignore_index=True)
    # 竖着拼接  和append一样
    pd.concat([grade_one , grade_two])
    # 横向拼接  以行索引进行拼接
    pd.concat([grade_one , grade_two] , axis=1)
    # 横向拼接  以行索引进行拼接 , 内连接 ,只保留拼接成功的数据
    pd.concat([grade_one , grade_two] ,join='inner', axis=1)

    第三个就是数据库拼接

    # 默认内连接  相当于并集
    pd.merge(grade_one , test ,left_on='姓名' , right_on='学生姓名')
    # 外连接  相当于交集
    pd.merge(grade_one , test ,left_on='姓名' , right_on='学生姓名',
            how='outer')
    # 左连接 左表有的都有
    pd.merge(grade_one , test ,left_on='姓名' , right_on='学生姓名',
            how='left')
    # 右连接 右表有的都有
    pd.merge(grade_one , test ,left_on='姓名' , right_on='学生姓名',
            how='right')

    重点:1. 描述统计 2. 离散化 3. 排序 4. 函数map ,applymap  5. 表合并 

    Pandas 不需要很多的逻辑思考,英文看懂,明白参数设置,用到的时候会查就行了。

  • 相关阅读:
    Python 五个知识点搞定作用域
    python中的三元表达式(三目运算符)
    Python中 sys.argv的用法简明解释
    pycharm多行批量缩进和反向缩进快捷键
    Python终端如何输出彩色字体
    第8周LeetCode记录
    第7周Leetcode记录
    《Java核心技术》第九章读书笔记(集合)
    《Java核心技术》第八章读书笔记(泛型)
    《Java核心技术》第七章读书笔记(异常处理)
  • 原文地址:https://www.cnblogs.com/BC10/p/11683570.html
Copyright © 2011-2022 走看看