zoukankan      html  css  js  c++  java
  • 数据分析的Pandas

    一.处理丢失数据

      两种丢失数据

        None      None是Python自带的,其类型为python object。因此,None不能参与到任何计算中。

        np.nan(NaN)      np.nan是浮点类型,能参与到计算中。但计算的结果总是NaN。

       pandas中的None与NaN

         1) pandas中None与np.nan都视作np.nan

    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame
    
    
    #创建DataFrame
    df = DataFrame(data=np.random.randint(10,50,size=(8,8)))
    df
    
    ##将某些数组元素赋值为nan
    
    df.iloc[1,3] = None
    df.iloc[2,2] = None
    df.iloc[4,2] = None
    df.iloc[6,7] = np.nan

        2) pandas处理空值操作

          isnull()

          notnull()

          dropna(): 过滤丢失数据

          fillna(): 填充丢失数据

    df.isnull()
    
    #创建DataFrame,给其中某些元素赋值为nan
    
    df.notnull().all(axis=1)     #notnull(all)   isnull(any)
    
    df.loc[df.notnull().all(axis=1)]

        df.dropna() 可以选择过滤的是行还是列(默认为行):axis中0表示行,1表示的列

    df.dropna(axis=0)

         填充函数 Series/DataFrame

           fillna():value和method参数

    df.fillna(method='ffill',axis=1)
    
    #method 控制填充的方式 bfill ffill

    二.创建多层列索引

      隐式构造

        最常见的方法是给DataFrame构造函数的index或者columns参数传递两个或更多的数组

      显示构造pd.Multilndex.from_

        使用数组

        使用 product:

    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame
    
    col=pd.MultiIndex.from_product([['qizhong','qimo'],
                                    ['chinese','math']])
    
    #创建DF对象
    df = DataFrame(data=np.random.randint(60,120,size=(2,4)),index=['tom','jay'],
             columns=col)
    #df
    
    df['qimo']

    2.多层行索引

      除了列索引,行索引也能用上述同样的方法创建多层行索引

    3.多层索引对象的索引与切片操作

    总结:
    # 访问一列或多列 直接用中括号[columnname]  [[columname1,columnname2...]]
    #访问一行或多行  .loc[indexname]
    # 访问某一个元素  .loc[indexname,columnname]  获取李四期中的php成绩
    # 行切片          .loc[index1:index2]        获取张三李四的期中成绩
    # 列切片          .loc[:,column1:column2]    获取张三李四期中的php和c++成绩

    4.聚合操作

      所谓的聚合操作:平均数,方差,最大值,最小值……

    三.pandas的拼接操作

    1.使用pd.concat()级联

      pandas使用pd.concat函数,与np.concatenate函数类似,只是多了一些参数:

        objs

        axis=0

        keys

        join='outer' / 'inner':表示的是级联的方式,outer会将所有的项进行级联(忽略匹配和不匹配),而inner只会将匹配的项级联到一起,不匹配的不级联

        ignore_index=False

       匹配级联

    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame
    
    df1 = DataFrame(data=np.random.randint(0,100,size=(3,3)),index=['a','b','c'],columns=['A','B','C'])
    df2 = DataFrame(data=np.random.randint(0,100,size=(3,3)),index=['a','d','c'],columns=['A','d','C'])
    
    pd.concat((df1,df1),axis=0,join='inner')

       不匹配级联

        不匹配指的是级联的维度的索引不一致。例如纵向级联时列索引不一致,横向级联时行索引不一致

         有2种连接方式:

          外连接:补NaN(默认模式)

           内连接:只连接匹配的项
    pd.concat((df1,df2),axis=1,join='outer')

       使用df.append()函数添加

        由于在后面级联的使用非常普遍,因此有一个函数append专门用于在后面添加

    2.使用pd.merge()合并

      merge与concat的区别在于,merge需要依据某一共同的列来进行合并

      使用pd.merge()合并时,会自动根据两者相同column名称的那一列,作为key来进行合并。

      注意每一列元素的顺序不要求一致

       参数:

        how:out取并集 inner取交集

         on:当有多列相同的时候,可以使用on来指定使用那一列进行合并,on的值为一个列表

      一对一合并

    df1 = DataFrame({'employee':['Bob','Jake','Lisa'],
                    'group':['Accounting','Engineering','Engineering'],
                    })
    df1
    
    df2 = DataFrame({'employee':['Lisa','Bob','Jake'],
                    'hire_date':[2004,2008,2012],
                    })
    df2
    
    pd.merge(df1,df2,how='outer')

      多对一合并

    df3 = DataFrame({
        'employee':['Lisa','Jake'],
        'group':['Accounting','Engineering'],
        'hire_date':[2004,2016]})
    df3
    
    df4 = DataFrame({'group':['Accounting','Engineering','Engineering'],
                           'supervisor':['Carly','Guido','Steve']
                    })
    df4
    
    pd.merge(df3,df4)

      多对多合并

    df1 = DataFrame({'employee':['Bob','Jake','Lisa'],
                     'group':['Accounting','Engineering','Engineering']})
    df1
    
    df5 = DataFrame({'group':['Engineering','Engineering','HR'],
                    'supervisor':['Carly','Guido','Steve']
                    })
    df5
    
    pd.merge(df1,df5,how='outer')

        加载excl数据:pd.read_excel('excl_path',sheetname=1)

      key的规范化

        当列冲突时,即有多个列名称相同时,需要使用on=来指定哪一个列作为key,配合suffixes指定冲突列名

    df1 = DataFrame({'employee':['Jack',"Summer","Steve"],
                     'group':['Accounting','Finance','Marketing']})
    
    df2 = DataFrame({'employee':['Jack','Bob',"Jake"],
                     'hire_date':[2003,2009,2012],
                    'group':['Accounting','sell','ceo']})

        当两张表没有可进行连接的列时,可使用left_on和right_on手动指定merge中左右两边的哪一列列作为连接的列

    df1 = DataFrame({'employee':['Bobs','Linda','Bill'],
                    'group':['Accounting','Product','Marketing'],
                   'hire_date':[1998,2017,2018]})
    
    df5 = DataFrame({'name':['Lisa','Bobs','Bill'],
                    'hire_dates':[1998,2016,2007]})

      内合并与外合并:out取并集  inner取交集

        内合并:只保留两者都有的key(默认模式)

    df6 = DataFrame({'name':['Peter','Paul','Mary'],
                   'food':['fish','beans','bread']}
                   )
    df7 = DataFrame({'name':['Mary','Joseph'],
                    'drink':['wine','beer']})

        外合并 how='outer':补NaN

    df6 = DataFrame({'name':['Peter','Paul','Mary'],
                   'food':['fish','beans','bread']}
                   )
    df7 = DataFrame({'name':['Mary','Joseph'],
                    'drink':['wine','beer']})
    display(df6,df7)
    pd.merge()

    示例

    需求:
    导入文件,查看原始数据
    将人口数据和各州简称数据进行合并
    将合并的数据中重复的abbreviation列进行删除
    查看存在缺失数据的列
    找到有哪些state/region使得state的值为NaN,进行去重操作
    为找到的这些state/region的state项补上正确的值,从而去除掉state这一列的所有NaN
    合并各州面积数据areas
    我们会发现area(sq.mi)这一列有缺失数据,找出是哪些行
    去除含有缺失数据的行
    找出2010年的全民人口数据
    计算各州的人口密度
    排序,并找出人口密度最高的五个州 df.sort_values()
    import numpy as np
    from pandas import DataFrame,Series
    import pandas as pd
    
    abb = pd.read_csv('./data/state-abbrevs.csv')
    pop = pd.read_csv('./data/state-population.csv')
    area = pd.read_csv('./data/state-areas.csv')
    
    #将人口数据和各州简称数据进行合并
    display(abb.head(1),pop.head(1))
    abb_pop = pd.merge(abb,pop,left_on='abbreviation',right_on='state/region',how='outer')
    abb_pop.head()
    #将合并的数据中重复的abbreviation列进行删除
    abb_pop.drop(labels='abbreviation',axis=1,inplace=True)
    abb_pop.head()
    #查看存在缺失数据的列
    abb_pop.isnull().any(axis=0)
    #找到有哪些state/region使得state的值为NaN,进行去重操作
    
    #1.检测state列中的空值
    abb_pop['state'].isnull()
    
    #2.将1的返回值作用的state_region这一列中
    abb_pop['state/region'][abb_pop['state'].isnull()]
    
    #3.去重
    abb_pop['state/region'][abb_pop['state'].isnull()].unique()
    #为找到的这些state/region的state项补上正确的值,从而去除掉state这一列的所有NaN
    abb_pop['state/region'] == 'USA'
    [{"metadata":{"trusted":false},"cell_type":"code","source":"indexs = abb_pop['state'][abb_pop['state/region'] == 'USA'].index","execution_count":23,"outputs":[]}]
    abb_pop.loc[indexs,'state'] = 'United State'
    pr_index = abb_pop['state'][abb_pop['state/region'] == 'PR'].index
    abb_pop.loc[pr_index,'state'] = 'PPPRRR'
    #合并各州面积数据areas
    abb_pop_area = pd.merge(abb_pop,area,how='outer')
    abb_pop_area.head()
    #我们会发现area(sq.mi)这一列有缺失数据,找出是哪些行
    abb_pop_area['area (sq. mi)'].isnull()
    
    a_index = abb_pop_area.loc[abb_pop_area['area (sq. mi)'].isnull()].index
    
    #去除含有缺失数据的行
    abb_pop_area.drop(labels=a_index,axis=0,inplace=True)
    
    #找出2010年的全民人口数据
    abb_pop_area.query('year == 2010 & ages == "total"')
    
    #计算各州的人口密度
    abb_pop_area['midu'] = abb_pop_area['population'] / abb_pop_area['area (sq. mi)']
    abb_pop_area.head()
    
    #排序,并找出人口密度最高的五个州 df.sort_values()
    abb_pop_area.sort_values(by='midu',axis=0,ascending=False).head()
     
    |
  • 相关阅读:
    URL和DNS解析
    web工作方式,浏览网页,打开浏览器,输入网址按下回车键,然后会显示出内容,这个过程是怎样的呢?
    PHP根据数组的值分组
    EditPlus注册码在线生成,强大
    php获取内容中第一张图片地址
    PHP函数ip2long转换IP时数值太大产生负数的解决办法
    js Uncaught SyntaxError: Unexpected token错误
    虚拟机centos6.5 --VirtualBox设置全屏
    虚拟机centos6.5 --设置静态ip
    centos之开放80端口
  • 原文地址:https://www.cnblogs.com/chenxi67/p/10491135.html
Copyright © 2011-2022 走看看