zoukankan      html  css  js  c++  java
  • 数据分析05 /pandas的高级操作

    数据分析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)
      
  • 相关阅读:
    JS中的宽高(基础知识很重要)
    JS基础知识总结
    Spring中的JdbcTemplate使用
    Spring中集合类型属性注入
    白盒交换机公司&产品列表
    虚拟化有哪几种架构
    全虚拟化与半虚拟化
    白牌交换机现状分析zz
    SDN控制器列表
    Arista公司
  • 原文地址:https://www.cnblogs.com/liubing8/p/12037255.html
Copyright © 2011-2022 走看看