python模块专题——6.pandas

pandas库用于矩阵运算

1.简介

Pandas是一个强大的分析结构化数据的工具集;它的使用基础是Numpy(提供高性能的矩阵运算);用于数据挖掘和数据分析,同时也提供数据清洗功能。

主要提供Series和DataFrame这两种数据结构及其系列操作,

2.Series

​ 它是一种类似于一维数组的对象,是由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据也可产生简单的Series对象。

2.1 创建Series

  • 类似一维数组,是一种带有索引的序列。可以通过列表和字典创建,不用处理NaN(None)
  • obj=pd.Series(obj,index=[])
  • 获取索引:obj.index
  • 获取数据:obj.values
  • 预览数据:obj.head(n)
  • 索引命名:obj.index.name=’’
  • 数据命名:obj.name=’’

2.2 数据访问

  • 判断索引是否存在:in
  • 通过整型索引:iloc[int] 多个索引是用list
  • 通过字符串索引:loc[’’]
  • 以上两种方式也可以直接访问:[]

向量化操作:通过numpy的一些方法进行计算,速度会优于循环处理

3 DataFrame

​ DataFrame是Pandas中的一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame即有行索引也有列索引,可以被看做是由Series组成的字典。

3.1 创建DataFrame

  • 类似于多维数组/表格数据,每列数据可以是不同的类型。可以通过字典创建Series类型的列表创建,也可以读取数据文件

  • 索引包括行索引(index)和列索引(label)

  • pd.DataFrame(obj,index=[])

  • 由Series列表创建

    import pandas as pd
    from faker import Faker
    
    faker=Faker('zh-CN')
    country1=pd.Series({'name':faker.name(),'job':faker.job(),'ID':faker.ssn()})
    country2=pd.Series({'name':faker.name(),'job':faker.job(),'ID':faker.ssn()})
    country3=pd.Series({'name':faker.name(),'job':faker.job(),'ID':faker.ssn()})
    country4=pd.Series({'name':faker.name(),'job':faker.job(),'ID':faker.ssn()})
    df=pd.DataFrame([country1,country2,country3,country4],index=['c1','c2','c3','c4'])
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wAh1JfVQ-1595686777776)(C:\Users\Regent Wan\AppData\Roaming\Typora\typora-user-images\1567684731048.png)]

  • 由文件读入

    • pd.read_csv(’.csv/txt’,index_col=’’,usecols=[],header=None,delimiter=’,’,names=[],dtype={‘列名’:类型,…},skiprows=n,nrows=n)

    • index_col给行索引加列名

    • usecols指定读取哪些列

    • 默认会将第一列作为索引名,若数据中第一列为数据,并非索引名时,通过header=None/0

    • delimiter分隔符,亦可使用sep

    • names指定列名,需要header=None,即不通过第一行读取

    • dtype指定每列类型

    • skiprows指定跳过行

    • nrows指定读取行数

      import pandas as pd
      iris=pd.read_csv('iris_data.csv',header=None,names=['Sepal Length','Sepal Width','Petal Length','Petal Width','type'])
      iris.head(10)
      
      Sepal Length Sepal Width Petal Length Petal Width type
      0 5.5 2.5 4.0 1.3 Iris-versicolor
      1 6.3 2.5 5.0 1.9 Iris-virginica
      2 5.5 2.6 4.4 1.2 Iris-versicolor
      3 6.0 2.2 4.0 1.0 Iris-versicolor
      4 6.0 2.2 5.0 1.5 Iris-virginica
      5 6.3 2.8 5.1 1.5 Iris-virginica
      6 5.5 2.4 3.8 1.1 Iris-versicolor
      7 6.7 3.3 5.7 2.1 Iris-virginica
      8 6.7 3.1 4.4 1.4 Iris-versicolor
      9 5.6 3.0 4.5 1.5 Iris-versicolor
  • series的to_frame(name=None)操作

  • 读取数据库:pd.read_sql(sql_sentence,connection)

3.2 数据访问

  • 直接使用[]访问时从行获取,使用loc时从列获取,使用iloc时则通过整型索引从列获取,均为Series对象

  • 获取行索引:df.index

  • 行或列索引

    • df[]列索引
    • df.loc[]行索引
    • df.iloc[]行索引
  • 混合索引

    • 先行索引后列索引

    • 先列索引后行索引

      #先列后行
      df['name']['c2']
      df['name'].loc['c2']
      df['name'].iloc[1]
      
      #先行后列
      df.loc['c2']['name']
      df.loc['c2'].loc['name']
      df.iloc[1]['name']
      

3.3 数据操作

  • 属性

    • shape/dtypes/ndim/index/columns/values
  • 预览数据:df.head(n)

    0 1 2 3 4
    0 5.5 2.5 4.0 1.3 Iris-versicolor
    1 6.3 2.5 5.0 1.9 Iris-virginica
    2 5.5 2.6 4.4 1.2 Iris-versicolor
    3 6.0 2.2 4.0 1.0 Iris-versicolor
    4 6.0 2.2 5.0 1.5 Iris-virginica
    5 6.3 2.8 5.1 1.5 Iris-virginica
    6 5.5 2.4 3.8 1.1 Iris-versicolor
    7 6.7 3.3 5.7 2.1 Iris-virginica
    8 6.7 3.1 4.4 1.4 Iris-versicolor
    9 5.6 3.0 4.5 1.5 Iris-versicolor
  • 数据信息:df.info()

    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 99 entries, 0 to 98
    Data columns (total 5 columns):
    5.5                99 non-null float64
    2.5                99 non-null float64
    4.0                99 non-null float64
    1.3                99 non-null float64
    Iris-versicolor    99 non-null object
    dtypes: float64(4), object(1)
    memory usage: 3.9+ KB
    
  • 统计信息:df.describe()

    0 1 2 3
    count 100.000000 100.000000 100.000000 100.000000
    mean 6.262000 2.872000 4.906000 1.676000
    std 0.662834 0.332751 0.825578 0.424769
    min 4.900000 2.000000 3.000000 1.000000
    25% 5.800000 2.700000 4.375000 1.300000
    50% 6.300000 2.900000 4.900000 1.600000
    75% 6.700000 3.025000 5.525000 2.000000
    max 7.900000 3.800000 6.900000 2.500000
  • 插入列:df[‘列名’]=[]

    若只给一个值时会广播操作,将该列的值全部赋值为该值

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9MfB74ec-1595686777780)(C:\Users\Regent Wan\AppData\Roaming\Typora\typora-user-images\1567685012531.png)]

  • 获取某列的取值集合:set(list(df[‘列名’]))

  • 转置:df.T

  • 排序

    • df.sort_values(by=“col”,ascending=True)
  • 删除:df.drop([’’],inplace=True,axis=0/1)

    • inplace为False时不修改原df,返回修改后的数据,若为True在原df上修改,返回None
    • axis指定删除方向,0为行索引(纵向计算),1为列索引(横向计算),默认为0
    • 这两个参数在很多情况都会用到
    • 也可以使用del关键词删除
  • 注意:从dataframe中取出数据进行操作后,会对原始数据产生影响;对获取的数据copy()操作之后,则不会对原数据产生修改。

4 Index

4.1 索引对象

  • Series和DataFrame中的索引都是Index对象

  • 不可变(immutable),保证了数据的安全

  • 常见Index

    • Index、Int64Index、MultiIndex、DatetimeIndex
  • reset_index(list(""))重置索引,取其中的某些行

  • 重命名列名:df.rename(columns={old:new,…},inplace=True)

    iris.rename(columns={0:'Sepal Length',1:'Sepal Width',2:'Petal Length',3:'Petal Width',4:'type'})
    
    Sepal Length Sepal Width Petal Length Petal Width type
    0 5.5 2.5 4.0 1.3 Iris-versicolor
    1 6.3 2.5 5.0 1.9 Iris-virginica
    2 5.5 2.6 4.4 1.2 Iris-versicolor
    3 6.0 2.2 4.0 1.0 Iris-versicolor

4.2 层级索引MultiIndex

  • set_index([])设置层级索引
  • 多级索引是读取数据方式:df.loc[‘第一级’,‘第二级’]
  • swaplevel()交换索引层级
  • sort_index(level=0)排序分层
  • 返回索引唯一值:df.set_index("").index.unique()

4.3 Boolean Mask

  • 获取某列指定取值的数据

    • df[df[‘列名’]==‘值’&…]
    Iris_virginica=iris[iris['type']=='Iris-virginica']
    

5 数据清洗

5.1 缺失值处理

  • 判断数据缺失:df.isnull()/notnull()
  • 填充缺失数据
    • df.fillna(t.mean()/t.median()/0) 获取该列非nan列表并求统计值,注意只在该列上操作
    • df.ffill()由前一个值填充
    • df.bfill()由后一个值填充
  • 删除缺失数据:df.dropna(axis=0,how=“any”,inplace=False)how的值为any时表示只要该行存在NaN即删除,all则全为NaN才删除

5.2 数据变形

  • 重复数据

    • duplicated()判断是否重复
    • drop_duplicated([’’],keep=‘last’)去除重复数据
    • unique() 或者set() 均可以去重
  • 表连接

    • df[‘列名’].map(dict)

    • dict为以df中该列的取值为键,map操作将dict中的值按键添加到df中

    • map中的dict可以通过lambda表达式指定

      dict={'Iris-versicolor':'1','Iris-virginica':'2'}
      iris['class']=iris[4].map(dict)
      iris
      
      0 1 2 3 4 class
      0 5.5 2.5 4.0 1.3 Iris-versicolor 1
      1 6.3 2.5 5.0 1.9 Iris-virginica 2
      2 5.5 2.6 4.4 1.2 Iris-versicolor 1
      3 6.0 2.2 4.0 1.0 Iris-versicolor 1
      4 6.0 2.2 5.0 1.5 Iris-virginica 2
  • 替换值

    • df.replace([],[])
  • 离散化与分箱

    • cats=pd.cut(data,bins,labels=[])
    • data为list数据,bins为list类型的分箱边界list类型,labels指定每个区间的标记
    • cats.categories返回边界索引
    • cats.codes分箱编码
    • pd.value_counts(cats)统计箱中元素个数
    • cats.get_values()获取数据的分箱值
  • one-hot编码(哑变量)

    • pf.get_dummies(series/dataframe)

      pd.get_dummies(iris[4])
      
      Iris-versicolor Iris-virginica
      0 1 0
      1 0 1
      2 1 0
      3 1 0
      4 0 1
  • 向量化字符串操作

    • .str.contains(’’)
    • .str.split(’’,expand=True)
    • .str.cat(s1,sep=’’)
    • .str.endswith(’’)
    • .str.startswith(’’)
    • .str.findall(’’)
    • .str.isalnum()
    • .str.isalpha()
    • .str.isdecimal()
    • .str.isdigit()
    • .str.islower()
    • .str.isnumeric()
    • .str.isupper()
    • .str.join(’’)
  • 分组(groupby)

    • split->apply->combine

    • g=df.groupby(‘列名’)返回可迭代对象,每次返回一个元组(group_name,group_data)

      iris_rename=iris.rename(columns={0:'Sepal Length',1:'Sepal Width',2:'Petal Length',3:'Petal Width',4:'type'})
      groups=iris_rename.groupby('type')
      groups['Sepal Length'].mean()
      groups['Sepal Length'].max()
      groups['Sepal Length'].min()
      groups.size()
      for g,f in groups:
          max=f['Sepal Length'].max()
          min=f['Sepal Length'].min()
          mean=f['Sepal Length'].mean()
          print("{} max:{},min:{},mean:{}".format(g,max,min,mean))
      
    • 也可以按指定的函数分组

      iris_index=iris.set_index(0)
      def get_rank_group(num):
          rank_group=''
          if num<5:
              rank_group=' <5'
          elif num<6:
              rank_group='5~6'
          elif num<7:
              rank_group='6~7'
          else:
              rank_group='>=7'
          return rank_group
      
      groups=iris_index.groupby(get_rank_group)
      groups
      for g,f in groups:
          print('{}:{}'.format(g,len(f)))
      
       <5:2
      5~6:31
      6~7:54
      >=7:13
      
  • 聚合(aggregation)

    • grouped.agg(fun),数组产生标量的过程,mean/count/…
    • 常用于分组后的数据计算
    • 内置聚合函数:sum/mean/max/min/count/size/describe
    • 可以通过字典为每列指定不同的操作方法
    • 可自定义函数,传入agg方法
    • agg参数可以指定为list,按不同的操作分别计算
  • 透视表

    • df.pivot_table(values=’’,index=’’,columns=’’,aggfun=,margins=)
    • values透视表中的元素值
    • index透视表的行索引
    • columns透视表的列索引
    • aggfunc聚合函数,可以指定多个
    • margins表示是否对所有数据统计
  • 合并merge

    • 多个dataframe进行合并
    • pd.merge(df1,df2,how=‘inner/outer/left/right’,on=‘列名’,left_index=True,right_index=True,left_on=’’,right_on=’’,suffixes=(’’,))df1中按照列名合并df2(inner只返回df1和df2中该列交集的合并,outer返回该列并集的合并,left以df1为准,right以df2为准,没有的地方NaN填充)
    • how=‘inner/outer/left/right’
    • apply(func)

Notice

应博友的要求,创建了一个QQ群,方便大家学习交流,群内也会经常分享一下学习资源。有兴趣的小伙伴可以加群哦!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Zeno_wrj/article/details/107586135