zoukankan      html  css  js  c++  java
  • Python 数据处理库pandas教程(最后附上pandas_datareader使用实例)

    0 简单介绍

    pandas是一个Python语言的软件包,在我们使用Python语言进行机器学习编程的时候,这是一个非常常用的基础编程库。本文是对它的一个入门教程。

    pandas提供了快速,灵活和富有表现力的数据结构,目的是使“关系”或“标记”数据的工作既简单又直观。它旨在成为在Python中进行实际数据分析的高级构建块。

    另外,pandas常常和NumPy一起使用,本文中的源码中也会用到NumPy(教程见Python 机器学习库 NumPy 教程)。

    1 安装

    pip install pandas

    2 核心数据结构

    pandas最核心的就是SeriesDataFrame两个数据结构。

    这两种类型的数据结构对比如下:

    名称维度说明
    Series 1维 带有标签的同构类型数组
    DataFrame 2维 表格结构,带有标签,大小可变,且可以包含异构的数据列

    DataFrame可以看做是Series的容器,即:一个DataFrame中可以包含若干个Series。

    3 Index对象与数据访问

    pandas的Index对象包含了描述轴的元数据信息。当创建Series或者DataFrame的时候,标签的数组或者序列会被转换成Index。

    请注意:

    1. Index并非集合,因此其中可以包含重复的数据
    2. Index对象的值是不可以改变,因此可以通过它安全的访问数据

    DataFrame提供了下面两个操作符来访问其中的数据:

    1. loc:通过行和列的索引来访问数据
    2. iloc:通过行和列的下标来访问数据

    3.1 基础方法:[].

    series1 = pd.Series([1, 2, 3, 4, 5, 6, 7],
        index=["C", "D", "E", "F", "G", "A", "B"])
     
    print("series1['E'] = {} 
    ".format(series1['E']));
    print("series1.E = {} 
    ".format(series1.E));

    结果:

    注1:对于类似属性的访问方式.来说,要求索引元素必须是有效的Python标识符的时候才可以,而对于series1.1这样的索引是不行的。

    注2:[].提供了简单和快速访问pands数据结构的方法。这种方法非常的直观。然而,由于要访问的数据类型并不是事先知道的,因此使用这两种方法方式存在一些优化限制。因此对于产品级的代码来说,pandas官方建议使用pandas库中提供的数据访问方法。

    3.2 loc与iloc

    • loc:通过行和列的索引来访问数据

    • iloc:通过行和列的下标来访问数据

     通过这两个操作符我们还可以访问某个范围之内的数据。

     3.3 at与iat

    这两个操作符用来访问单个的元素值(Scalar Value)。类似的:

    • at:通过行和列的索引来访问数据
    • iat:通过行和列的下标来访问数据

    3.4  Index对象

    Index提供了查找,数据对齐和重新索引所需的基础数据结构。

    我们可以通过一个数组来创建Index对象。在创建的同时我们还可以通过name指定索引的名称:

    index = pd.Index(['C','D','E','F','G','A','B'], name='note')

    3.5 MultiIndex

    MultiIndex,或者称之为Hierarchical Index是指数据的行或者列通过多层次的标签来进行索引。

    4 Series数据对象

    4.1 Series数据对象的生成

    Series是一维结构的数据,Series的数据类型有list、ndarray、字典、常量;

    以下结果中:

    输出的最后一行是Series中数据的类型,这里的数据都是int64类型的。

    数据在第二列输出,第一列是数据的索引,在pandas中称之为Index

    • list

    data=[-2,-1,0,1,2]
    index=["a","b","c","d","e"]
    s1=pd.Series(data,index=index)
    print(s1)

    结果:

    • ndarray

    data=np.random.randn(5)
    index=["a","b","c","d","e"]
    s2=pd.Series(data,index=index)
    print(s2)

    结果:

     

    • 字典

    data={'a':0,'b':1,'c':2}
    index=["a","b","c","d","e"]
    s3=pd.Series(data,index=index)
    print(s3)

    结果:

     

    • 常量

    data=5
    index=["a","b","c","d","e"]
    s4=pd.Series(data,index=index)
    print(s4)

    结果:

     

    如果不指定(像上面这样),索引是[a, ...,z]的形式。不过我们也可以在创建Series的时候指定索引。索引未必一定需要是整数,可以是任何类型的数据,例如字符串。

    4.2  Series数据对象的访问

     Series的访问方法:s.values、s.index、索引访问、切片访问

    print(s3.values)
    print(s3.index)
    print(s3[['a','b']]) #print(s3['a'])
    print(s3[:3])

    结果:

    5 DataFrame数据对象

    5.1 DataFrame数据对象的生成

    DataFrame的数据类型有列表组成的字典、嵌套列表、二维ndarray、Series组成的字典、字典的列表、字典组成的字典等;DataFrame默认的索引和列名都是[0, N-1]的形式。

    • 列表组成的字典

    data={'one':[1,2,3,4],'two':[5,6,7,8]}
    df1=pd.DataFrame(data)
    print(df1)

    结果:

     

    • 嵌套列表

    data=[[1,2,3,4],[5,6,7,8]]
    df2=pd.DataFrame(data,index=['a','b'],columns=['one','two','three','four'])
    print(df2)

    结果:

     

    • 二维ndarray

    data=np.zeros((2,),dtype=[('A','i4'),('B','f4'),('C','a10')])
    print(data)
    df3=pd.DataFrame(data)
    print(df3)

    结果:

     

    • Series组成的字典

    DataFrame的不同列可以是不同的数据类型;如果以Series数组来创建DataFrame,每个Series将成为一行,而不是一列。

    data={'one':pd.Series([1,2,3],index=['a','b','c']),
          'two':pd.Series([4,5,6],index=['b','c','d'])}
    df4=pd.DataFrame(data)
    print(df4)

    结果:

     

    • 字典的列表

    data=[{'a':1,'b':2},{'a':4,'b':4,'c':5}]
    df5=pd.DataFrame(data)
    print(df5)

    结果:

     

    • 字典组成的字典

    data={('a','b'):{('A','B'):1,('A','C'):2},
          ('a','a'):{('A','C'):3,('A','B'):4},
          ('a','c'):{('A','B'):5,('A','B'):6},
          ('b','a'):{('A','C'):7,('A','B'):8},
          ('b','b'):{('A','D'):9,('A','B'):10}
    }
    df6=pd.DataFrame(data)
    print(df6)

    结果:

     

    5.2 DataFrame数据对象的访问

    print(df1)
    print(df1.index)
    print(df1.columns)
    print()
    print(df1.values)
    print()
    print(df1['one']) # print(df[['one']]) 此写法带列标
    print()
    print(df1[0:1])
    
    print(df1.loc[:,['one','two']])
    print()
    print(df1.loc[[0],['one','two']])
    print()
    print(df1.iloc[0:2,0:1])
    print()
    print(df1.ix[0,['one','two']])
    print()
    print(df1.ix[[0,1],[0,1]])

    结果:

     6 数据整合

     6.1 Concatenate:串联,连接,级连

     

    6.2 Append:附加,增补

     

    6.3 Merge:融合,归并,合并

     

    6.4 Join:合并,接合,交接

     

    7 文件操作

    pandas库提供了一系列的read_函数来读取各种格式的文件,它们如下所示:

     7.1 读取Excel文件

    注:要读取Excel文件,还需要安装另外一个库:xlrd

    df1 = pd.read_excel("data/test.xlsx")

    7.2 读取CSV文件

    df2 = pd.read_csv("data/test1.csv")

    8  处理无效值

    8.1 忽略无效值

    通过pandas.DataFrame.dropna函数抛弃无效值

    8.2替换无效值

     通过fillna函数将无效值替换成为有效值

    9 实例:使用pandas_datareader获取股票数据并处理

    # -*- coding: utf-8 -*-
    """
    Created on Wed Jun  5 20:20:47 2019
    
    @author: quanzhan
    """
    
    import numpy as np
    import pandas as pd 
    import pandas_datareader.data as web
    import datetime
    #获取股票数据方法一:
    #df_csvsave=web.DataReader('601233.SS','yahoo',datetime.datetime(2019,6,1),datetime.date.today())
    #保存到csv
    #df_csvsave.to_csv('D:\AnacondaProjects\learnnumpy\exchange_06.csv',columns=df_csvsave.columns,index=True)
    #获取股票数据方法二:
    df_csvload=pd.read_csv("D:\AnacondaProjects\learnnumpy\exchange_06.csv",parse_dates=True,index_col=0,encoding='gb2312')
    print("***************************************************")
    print(df_csvload)
    print("***************************************************")
    print(df_csvload.index)
    print(df_csvload.columns)
    
    print("*****#股票内容查看: head()、tail()、shape、describe()、info()*********")
    #股票内容查看: head()、tail()、shape、describe()、info()
    print(df_csvload.head(3))
    print(df_csvload.tail(3))
    print(df_csvload.shape)
    print(df_csvload.describe())
    print(df_csvload.info())
    print("*******# 缺失值处理:isnull()、notnull()、dropna()、fillna()**********")
    # 数据规整化处理
    # 缺失值处理:isnull()、notnull()、dropna()、fillna()
    print(df_csvload.isnull())
    # .T.any()非缺失值仍然显示
    print(df_csvload.notnull().T.any())
    # axis=0删除包含缺失值的行 axis=1 删除包含缺失值的列 how='all' 所有值均缺就删除 how='any'只要有一个缺失值就删除
    print(df_csvload.dropna(axis=0,how='all'))
    # method='ffill'行或列上的上一个值来填充缺失值 inplace=True 改变原来的dataFrame
    print(df_csvload.fillna(method='ffill',axis=0,inplace=True))
    print("***************# 精度转换  :(1) '%0.2f'%x******************")
    # 特殊值处理
    # 精度转换  :(1) '%0.2f'%x
    df_csvload1=df_csvload.applymap(lambda x:'%0.3f'%x)
    
    df_csvload1.Volume=df_csvload.ix[:,['Volume']].apply(lambda x:'%0.0f'%x,axis=1)
    print(df_csvload1)
    print("******************# 精度转换  :(2)*********************************")
    # 精度转换  :(2)
    df_csvload2=df_csvload.round(1)
    df_csvload2.Volume=df_csvload2.Volume.astype(int)
    print(df_csvload2)
    print("****************# 特定值查询后用此列的中位数填充*********************")
    # 特定值查询后用此列的中位数填充
    print(df_csvload)
    print()
    print(df_csvload[df_csvload.values==0])
    df_csvload.loc[df_csvload.loc[:,'High']==0,'High']=df_csvload.High.median()
    print()
    print(df_csvload)

    参考

     Python数据处理库pandas入门教程

    Python数据处理库pandas进阶教程

  • 相关阅读:
    openstack-ntp时间同步服务
    如何将icon图标库引入自己的项目中
    微信小程序实现滑动tab切换和点击tab切换并显示相应的数据(附源代码)
    微信小程序分享至朋友圈的方法
    微信小程序--分享功能
    mpvue-新建页面、页面跳转、自适应单位
    微信小程序mpvue-动态改变navigationBarTitleText值
    mpvue中使用flyjs全局拦截
    H5 布局 -- 让容器充满屏幕高度或自适应剩余高度
    使用mpvue开发小程序如何定义全局变量
  • 原文地址:https://www.cnblogs.com/hoaprox/p/10971980.html
Copyright © 2011-2022 走看看