数据分析05 /pandas的高级操作

1. 替换操作

替换操作可以同步作用于Series和DataFrame中

  • 创建df表格数据:

    import numpy as np
    import pandas as pd
    from pandas import DataFrame,Series df = DataFrame(data=np.random.randint(0,100,size=(8,7)))
  • 普通替换: 替换所有符合要求的元素:to_replace=15,value='e'

    df.replace(to_replace=0,value='zero')
  • 按列指定单值替换: to_replace={列标签:替换值} value='value'

    df.replace(to_replace={0:'aaa',22:222666})
  • 指定行替换

    df.iloc[2] = [0,0,0,0,0,0,0]
    df
  • 指定列替换

    df.replace(to_replace={4:0},value=666)
    
    # 将第4列中的0替换成666

2. 映射操作

  • 概念:map是Series的一个方法,创建一个映射关系列表,把values元素和一个特定的标签或者字符串绑定(给一个元素值提供不同的表现形式)

  • 需求:创建一个df,两列分别是姓名和薪资,然后给其名字起对应的英文名

    1.创建一个df表格:

    dic = {
    'name':['张三','李四','王老五'],
    'salary':[22222,7777,11111]
    }
    df = DataFrame(data=dic)
    df

    2.创建映射表:

    # 映射关系表
    dic = {
    '张三':'tom',
    '李四':'jay',
    '王老五':'jerry'
    }
    df['e_name'] = df['name'].map(dic)
    df

3. 运算工具

  • map:map括号中放的是函数就是充当运算工具来使用

    示例:超过3000部分的钱缴纳50%的税,计算每个人的税后薪资

    def after_sal(s):   # 返回税后薪资,参数s就是税前薪资
    return s - (s-3000)*0.5 df['after_sal'] = df['salary'].map(after_sal)
    df
  • apply:apply是df的一个方法/运算工具,可以将df中行或者列数据进行某种形式的运算操作。

    def func(s):
    s = s.sum()
    print(s)
    df.apply(func,axis=0) # 结果:
    张三李四王老五
    41110
    tomjayjerry
    25055.0

4. 映射索引 / 更改之前索引

  • 使用rename()函数替换行索引

    参数介绍:index 替换行索引,columns 替换列索引

    1.创建df4表格

    df4 = DataFrame({'color':['white','gray','purple','blue','green'],'value':np.random.randint(10,size = 5)})
    df4

    2.映射行/列索引

    # 映射关系表:映射行索引
    new_index = {0:'first',1:'two',2:'three',3:'four',4:'five'}
    # 映射关系表:映射列索引
    new_col={'color':'cc','value':'vv'} df4.rename(new_index,columns=new_col)

5. 排序实现的随机抽样/打乱表格数据

  • np.random.permutation():指定数内随机排序

    np.random.permutation(10)
    
    # 结果:
    array([8, 2, 6, 7, 3, 9, 1, 5, 0, 4])
  • take():将df数据的行/列进行打乱操作

    df = DataFrame(data=np.random.randint(0,100,size=(100,3)),columns=['A','B',"C"])
    df.take(np.random.permutation(3),axis=1).take(np.random.permutation(100),axis=0)[:50]

6. 数据的分类处理 / 分组

  • 数据分类处理的核心:groupby()函数,groups属性查看分组情况

    1.创建表格

    df = DataFrame({'item':['Apple','Banana','Orange','Banana','Orange','Apple'],
    'price':[4,3,3,2.5,4,2],
    'color':['red','yellow','yellow','green','green','green'],
    'weight':[12,20,50,30,20,44]})
    df

    示例1:计算每种水果的平均价格

    # 分组
    df.groupby(by='item')
    # 结果:<pandas.core.groupby.DataFrameGroupBy object at 0x000001B6E3D4A0B8> # 查看分组情况
    df.groupby(by='item').groups
    # 结果:
    {'Apple': Int64Index([0, 5], dtype='int64'),
    'Banana': Int64Index([1, 3], dtype='int64'),
    'Orange': Int64Index([2, 4], dtype='int64')} # 请平均价格
    df.groupby(by='item').mean()['price'] # 不推荐
    df.groupby(by='item')['price'].mean() # 推荐

    示例2:计算每种颜色水果的平均重量

    df.groupby(by='color')['weight'].mean()

    示例3:将每种水果的平均价格数据汇总到原数据中,通过映射实现

    # 求每种水果的平均价格
    mean_price_series = df.groupby(by='item')['price'].mean() # 将mean_price_series转换成字典,mean_price_series是Series类型
    dic = mean_price_series.to_dict() # 建立item和平均价格的映射关系,并在表中创建mean_price列
    df['mean_price'] = df['item'].map(dic)

7. 高级数据聚合

  • 使用groupby分组后,也可以使用transform和apply提供自定义函数实现更多的运算

    示例:

    df.groupby('item')['price'].sum() <==> df.groupby('item')['price'].apply(sum)
  • transform和apply都会进行运算,在transform或者apply中传入函数即可,transform和apply也可以传入一个lambda表达式

    transform应用示例1:

    # 错误示例:
    def abc(s):
    return s
    df.groupby(by='item')['price'].abc() # abc不是Series对象的方法 # 正确使用:
    df.groupby(by='item')['price'].transform(abc) #通过transform可以实现

    transform应用示例2:自定义一个求均值的函数,作用到分组结果中

    def my_mean(s):
    sum = 0
    for i in s:
    sum+=i
    return sum/s.size
    df.groupby(by='item')['price'].transform(my_mean)

    apply应用实例:自定义一个求均值的函数,为了防止混淆,可以忽略此方法

    def my_mean(s):
    sum = 0
    for i in s:
    sum+=i
    return sum/s.size
    df.groupby(by='item')['price'].apply(my_mean)

8. 数据加载

  • 读取type-.txt文件数据

    import pandas as pd
    from pandas import DataFrame,Series
    data=pd.read_csv('./data/type-.txt') # data/type-.txt文件数据:
    """
    你好-我好-他也好
    也许-大概-有可能
    然而-未必-不见得
    """

    将文件中每一个词作为元素存放在DataFrame中

    data=pd.read_csv('./data/type-.txt',sep='-',header=None)
    
    # sep:通过sep指定的符号切割
    # header=None,不以数据的第一行作为列的索引
  • 读取数据库中的数据

    # 连接数据库,获取连接对象
    import sqlite3 as sqlite3
    conn=sqlite3.connect('./data/weather_2012.sqlite') # 读取库表中的数据值
    sql_df=pd.read_sql('select * from weather_2012',conn)
    sql_df # 将一个df中的数据值写入存储到db
    df.to_sql('fruit',conn) # 此方法不适用mysql数据库的写入

9. 透视表

  • 透视表概述:

    透视表是一种可以对数据动态排布并且分类汇总的表格格式。或许大多数人都在Excel使用过数据透视表,也体会到它的强大功能,而在pandas中它被称作pivot_table。

  • 透视表的优点:

    • 灵活性高,可以随意定制你的分析计算要求
    • 脉络清晰易于理解数据
    • 操作性强,报表神器
  • 透视表的参数:

    pivot_table有四个最重要的参数index、values、columns、aggfunc

    index参数:分类汇总的分类条件

    values参数:需要对计算的数据进行筛选

    Aggfunc参数:设置我们对数据聚合时进行的函数操作,当我们未设置aggfunc参数:默认aggfunc='mean'计算均值

    Columns参数:可以设置列层次字段,对values字段进行分类

  • 示例:分析NBA球星的比赛数据

    将数据读取出来

    import pandas as pd
    import numpy as np
    df = pd.read_csv('./data/basketball_game.csv')
    df.head()

    1.查看Harden对阵过球队的比赛数据

    df.pivot_table(index='对手')  # 默认分类汇总使用的聚合函数是mean

    2.对阵同一对手在不同主客场下的数据,分类条件为对手和主客场

    df.pivot_table(index=['对手','主客场'])

    3.只需要Harden在主客场和不同胜负情况下的得分、篮板与助攻三项数据

    df.pivot_table(index=['主客场','胜负'],values=['得分','篮板','助攻'])
    
    # values参数的使用

    4.获取Harden在主客场和不同胜负情况下的总得分、总篮板、总助攻数

    df.pivot_table(index=['主客场','胜负'],values=['得分','篮板','助攻'],aggfunc='sum')
    
    # aggfunc参数的使用

    5.获取Harden在主客场和不同胜负情况下的平均得分、总篮板、最小助攻数

    df.pivot_table(index=['主客场','胜负'],aggfunc={'得分':'mean','篮板':'sum','助攻':'min'})

    6.获取所有队主客场的总得分

    df.pivot_table(index='主客场',values='得分',aggfunc='sum')

    7.获取每个队主客场的总得分(在总得分的基础上又进行了对手的分类)

    df.pivot_table(index='主客场',values='得分',aggfunc='sum',columns='对手').fillna(value=0)
    
    # Columns参数的使用

10. 交叉表

  • 交叉表概述:是一种用于计算分组的特殊透视图,对数据进行汇总,pd.crosstab(index,colums)

  • 交叉表pd.crosstab(index,colums)的参数:

    index参数:分组数据,交叉表的行索引

    columns参数:交叉表的列索引

  • 交叉表应用示例:

    1.创建表

    df = DataFrame({'sex':['man','man','women','women','man','women','man','women','women'],
    'age':[15,23,25,17,35,57,24,31,22],
    'smoke':[True,False,False,True,True,False,False,True,False],
    'height':[168,179,181,166,173,178,188,190,160]})
    df

    2.求出不同性别抽烟的人数

    pd.crosstab(df.smoke,df.sex)

    3.求出各个年龄段抽烟人情况

    pd.crosstab(df.age,df.smoke)

数据分析05 /pandas的高级操作的更多相关文章

  1. Pandas的高级操作

    pandas数据处理 1. 删除重复元素 使用duplicated()函数检测重复的行,返回元素为布尔类型的Series对象,每个元素对应一行,如果该行不是第一次出现,则元素为True keep参数: ...

  2. 利用Python进行数据分析(15) pandas基础: 字符串操作

      字符串对象方法 split()方法拆分字符串: strip()方法去掉空白符和换行符: split()结合strip()使用: "+"符号可以将多个字符串连接起来: join( ...

  3. Python数据分析之pandas学习(基础操作)

    一.pandas数据结构介绍 在pandas中有两类非常重要的数据结构,即序列Series和数据框DataFrame.Series类似于numpy中的一维数组,除了通吃一维数组可用的函数或方法,而且其 ...

  4. 数据分析06 /pandas高级操作相关案例:人口案例分析、2012美国大选献金项目数据分析

    数据分析06 /pandas高级操作相关案例:人口案例分析.2012美国大选献金项目数据分析 目录 数据分析06 /pandas高级操作相关案例:人口案例分析.2012美国大选献金项目数据分析 1. ...

  5. pandas高级操作

    pandas高级操作 import numpy as np import pandas as pd from pandas import DataFrame,Series 替换操作 替换操作可以同步作 ...

  6. 数据分析之Pandas操作

    Pandas pandas需要导入 import pandas as pd from pandas import Series,DataFrame import numpy as np 1 Serie ...

  7. 数据分析之Pandas

    一.Pandas介绍 1.介绍 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具. ...

  8. 一句Python,一句R︱pandas模块——高级版data.frame

    先学了R,最近刚刚上手python,所以想着将python和R结合起来互相对比来更好理解python.最好就是一句python,对应写一句R. pandas可谓如雷贯耳,数据处理神器. 以下符号: = ...

  9. 数据分析工具Pandas

        参考学习资料:http://pandas.pydata.org 1.什么是Pandas? Pandas的名称来自于面板数据(panel data)和Python数据分析(data analys ...

随机推荐

  1. IP组网实验(使用Cisco Packet Tracer路由器模拟软件)

    最近计网课讲到了以太网,第二个计网实验就是IP组网实验.这个实验主要使用了netsim这个路由器模拟软件.怎奈mac上没有,于是用Cisco Packet Tracer进行了一次模拟(其实就是实验中的 ...

  2. cb31a_c++_STL_算法_查找算法_(4)find_first_of

    cb31a_c++_STL_算法_查找算法_(4)find_first_offind_first_of(b,e,sb,se),sb,second begin, se,second end();find ...

  3. 一文带你了解Redis持久化完整版本

    本文讲解知识点 持久化的简介 RDB AOF RDB与AOF的区别 持久化应用场景 对于持久化这个功能点,其实很简单没有那么复杂 演示环境 centos7.0 redis4.0 redis存放目录:/ ...

  4. 【Java】HashMap实现原理---数据结构

    作为一个程序猿,特别是Java后端的,应该全部人都用过HashMap,也都知道HaspMap是一个用于存储Key-Value键值对的集合.与此同时我们把每一个键值对也叫做 Entry. 而这些Entr ...

  5. linux 在指定文件夹下查找指定字符

    grep -r '119090610015743205' /data/html/www/gap_bz_middleware/storage/apiLogs/

  6. Redis持久化机制,优缺点,如何选择合适方式

    一.什么是Redis持久化? 持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失. 二.Redis 的持久化机制是什么?各自的优缺点? Redis 提供两种持久化机制 RDB(默认) 和 ...

  7. 谈谈 Promise 以及实现 Fetch 的思路

    Promise 是异步编程的一种解决方案. Promise /** * 属性 */ Promise.length Promise.prototype /** * 方法 */ Promise.all(i ...

  8. Github仓库如何选择开源许可证

    Github仓库如何选择开源许可证 目录 Github仓库如何选择开源许可证 为什么需要开源许可证? 不使用开源许可证对于开发者有何影响? 不使用开源许可证对于项目的使用者有何影响? Github的开 ...

  9. python计算矩阵均匀分布程度

    计算N×M(建议维度大于100*100)的0,1矩阵均匀分布程度,值由0到1表示不均匀到均匀 import numpy as np def make_rand_matrix(side=20): # 制 ...

  10. 逻辑式编程语言极简实现(使用C#) - 2. 一道逻辑题:谁是凶手

    本系列前面的文章: 逻辑式编程语言极简实现(使用C#) - 1. 逻辑式编程语言介绍 这是一道Prolog经典的练习题,中文翻译版来自阮一峰的文章<Prolog 语言入门教程>. 问题 B ...