Python: 使用Pandas处理数据

pandas介绍

  • pandas名字来源于panel datas,即面板数据
  • pandas主要用于数据分析及数据处理
  • pandas最常用的两种数据结构是SeriesDataFrame 从形状上来看,DataFrame是二维数据结构的封装,SeriesDataFrame中的一列,是一维数据结构的封装
  • pandas提供的更重要的API包括数据清洗、数据预处理、数据操作、数据读取和导出

pandas.Series

  • 可以将Series看作更强的字典,提供了许多类似numpy数组的API

  • 构造方法:Series(data=None, index=None, dtype=None, name=None, copy=None)

    • data:数据源,可以是列表、字典、数组

    • index:索引列表/数组

      data提供的是列表或数组时,index默认为以0开头的递增索引序列,也可以提供长度和data相同的一维数据结构

      data提供的是字典时,index若为None则默认index为该字典的键,Series中的值为该字典的值,若index不为None则起筛选作用,以index的值为索引值,若某索引值存在于data中则取data的值,否则为numpy.nan

      本质上是自动转换为一个AxesData对象(用于存储索引信息的数据对象),可以通过自定义index实现类似字典的索引

    • name:该Series对象的名字,可以在DataFrame等结构中索引

  • Series实例属性:

    • indexIndex对象,表示索引数据

    • valuesnumpy数组,表示其存储的数据

    • dtype:存储数据的数据类型,可以在构造方法中指定,否则自动推断

    • shapeSeries对象的形状,Series永远将data视为一维结构,即使传递一个二维数组

  • Series实例方法:

    • describe():返回Series对象,包含原对象的各种统计数据,包括'count', 'mean', 'std', 'min', 'max'

      也可以通过调用原对象的count()mean()方法直接获取单个统计数据,其中sum(), cov(), corr()等是describe()没有涉及到的

    • unique():返回去重后的numpy数组

    • sort_index()sort_values():返回根据索引或根据值排序后的Series对象

    • dropna():返回删除了所有nan后的Series对象

    • fillna(v):返回将所有nanv填充后的Series对象

    • to_list()to_frame():转化为原生列表和DataFrame对象

    • locilocpandas支持切片语法,同时提供了另一种索引方法loc(line of code),通过loc[label]iloc[index]可以更清晰地表示索引,它们和原生索引的最明显区别是:切片符是双闭切片

      无论是原生切片符还是loc切片,Series对象都同样支持条件过滤,而且它实现了一般的运算符重载,均为逐元素运算,同numpy数组一样在运算时会自动对齐

    • cumsum(), cumprod(), cummax(), cummin():返回前缀求和/求积/取最大/取最小处理后的Series对象

  • 构造方法示例:

    1
    2
    3
    4
    5
    6
    7
    import pandas as pd

    s1 = pd.Series([1, 2]) # 0:1, 1:2
    s2 = pd.Series([1, 2], index=[2, 1]) # 2:1, 1:2
    s3 = pd.Series([[1, 2], [3, 4]]) # shape: (2,) 0:list[1,2], 1:list[3,4]
    s4 = pd.Series({1:2, 'a':3}) # 1:2, 'a':3
    s5 = pd.Series({1:2, 'a':3}, index=[1, 2]) # 1:2, 2:None

pandas.DataFrame

  • Series可以看作更强的字典,而DataFrame则可以看作值全为Series对象的字典,因此它是二维数据结构

    Series不同的是,DataFrame有行索引和列索引

  • 构造方法:DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)

    • data:可以是列表、数组、字典,DataFrame永远将data视为二维数据结构来解析

      data提供的是字典,则使用字典的键作为columns(列索引),用字典的值作为列,要求每一列结构相同,索引统一为index参数(行索引)

      此外,DataFrameSeries看作一列,将二维数组的第一维看作行、第二维看作列

    • indexcolumns参数分别为行索引和列索引

  • DataFrame实例方法:

    • 大多数方法和Series的实例方法一致,此外详细介绍loc系列索引方法

      loc[x][y]:按照先列再行的顺序索引,和原生的切片符不同,本质是先通过列索引取得Series再用Series.loc

      loc[x, y]:取xy列,和原生的切片符一致

      loc[[x1, x2, ...], [y1, y2, ...]]:选取第x1, x2, ...行、第y1, y2, ...列的元素并返回DataFrame,其中这些值是离散的,不能用:

      loc[[x1, x2, ...]]:相当于在上述方法的基础上,默认选择全部列,只选择x1, x2, ...行的元素

    • 类型转换方法:to_csv(), to_excel(), to_json(), to_sql()

    • transpose()T:返回转置后的DataFrame

读取数据

  • 读取csv文件:pandas.read_csv(filepath_or_buffer, sep, head, names, dtype, index_col)

  • 读取excel文件:pandas.read_excel(io, sheet_name, header, names, index_col, usecols, dtype, engine, ...)

  • 读取数据库文件:pandas.read_sql(query, conn_obj)

  • 读取网页文件:pandas.read_html(url)