Skip to content
Starslayerx edited this page Mar 20, 2021 · 29 revisions

green-pi
Pandas(panel data)基于Numpy,其主要数据类型为Series和DataFrame,分别为一维和二维数据表,还有Panel类型,用于三维甚至更高维的数据,但很少使用。 pandas_dataframe

import pandas as pd

Pandas基础数据类型

  • Series
    Series是一维的数组型对象,内部嵌套了一个一维的ndarry类型,并含有数据标签index。 分别可以通过valuesindex属性来获取数据值和标签.
    此外还有deype属性表示数据类型,Series.index和Series本身都有有name属性表示其名称
    Series
    (交互式环境下索引在左,值在右) $ \ $
    Series可以执行numpy中的数组运算,运算会作用在values即其内嵌的ndarray上。 生存Series序列主要有以下几种方法:
  1. 使用一维ndarray生成Series
    # index默认从0开始,也可以自行指定
    pd.Series(np.arange(5), index=['a', 'b', 'c', 'd', 'e'])
  2. 使用列表或元组构建
    pd.Series([1,2,3,...])
    pd.Series((4,5,6,...))
  3. 使用字典构建
    $$ 键 \rightarrow index \ 值 \rightarrow values $$
    pd.Series({},index=...)

若修改index后,多出的index对应的值为NaN,缺少的index及其对应的值会消失

  1. 使用DataFrame类型中的某一列构建
    将DataFrame中的一列提取出来就是一个Series类型。frame[column]这样取后原来的column列索引就是获得的Series的name,原来的index也就是之后Series的index。

若要检查Series的缺失值,可以使用isnull()notnull()函数,返回一个对应的布尔数组型的Series


  • DataFrame
    DataFrame为二维数据,行和列分别有索引'index'和'columns',他们都有name属性,但不同于Series其本身并没有name属性。DataFrame也有dtype属性,values为一个二维的ndarray类型。
    pd.DataFrame(data=2d_array, index=[行索引], columns=[列索引], dtype='...')
    DataFrame
    • 列: 通过frame[column]frame.column都可以获取列,但后则只有在列名为python变量名时才有效,前者还可以用来添加一列。 若要删除列,可以使用del语句del frame[column]
    • 行: 行可以通过位置特殊属性loc进行选取 此外,还可以对行列进行转置frame.T,index将会和column交换

  • Index
    Index为索引对象,Series和DataFrame都有索引对象,但不一定就是Index,还可能为RangeIndex Int64Index等多种形式,但他们都是索引类型。

    一些索引对象的方法 描述
    append 将额外索引粘贴到原索引,产生一个新索引
    difference 两个索引的差集
    intersection 交集
    union 并集
    isin 每个值是否在传入容器中
    delete 将i位置元素删除,产生新索引
    drop 删除指定的元素,产生新索引
    insert 在i位置插入元素,产生新索引
    is_monotonic 是否递增
    is_unique 索引是否唯一
    unique 去除重复索引

元素索引

  • 重建索引
    DataFrame.reindex()函数可以重建索引

    DataFrame.reindex(labels=None, index=None, columns=None, axis=None, method=None, copy=True, level=None, fill_value=nan, limit=None, tolerance=None)

    reindex方法的参数

    参数 描述
    index 可以为索引类型或者py其他数据结构,替换index(新的index的值不会继承原来位置的值,默认为Nan)
    columns 替换columns索引
    method 'fill'向前填充, 'bfill'向后填充(对str类型没有用,str类型无法比大小)
    fill_value 用于填充Nan
    limit 向前后填充时填充的最大行数
    copy True总是复制底层数据
  • 删除行列

    pd.drop([], axis=0/1, inplace=True)

    axis: 删除指定的index行或columns列
    inplace: 表示是否改变原对象

  • 选择数据
    使用loc和iloc选择数据

    # 使用索引名选取数据
    DataFrame.loc[[index], [columns]]
    
    # 按索引顺序选取数据
    DataFrame.iloc[[index_number], [columns_number]]

    下面是DataFrame索引选项表

    类型 描述
    df[val] 访问列
    df.loc[] 访问单或多
    df.iloc[] $\uparrow$
    df.loc[:, n] 访问单或多
    df.iloc[:, n] $\uparrow$
    df.at[label_i, label_j ] 根据行列访问单个元素
    df.iat[label_i, label_j ] $\uparrow$
    get_value set_value 根据行和列设置单个值

算术与填充

Series或DataFrame相加时会对索引做并集,唯一的索引值变成NaN。只有索引相同的元素才会进行运算

算术方法 描述
add, radd +
sub, rsub -
div, rdiv /
floordiv, rfoordiv //
mul, rmul *
pow, rpow **

可选参数: fill_value,用于填充NaN值

  • 广播

    1. DataFrame减去或加上一个同列数的Sereis是,会将操作广播到每一行,即对每一行加减Series。
    2. Series中的索引会与列索引进行匹配,若有多的索引运算后的值为NaN。
    3. 若要对行进行批评,广播到列,可修改参数axis=1
  • 重复索引 索引可以有重复的值,使用这种索引时会返回所有该索引对应的值,可以使用is_unique属性判断索引是否唯一

    Index.is_unique

函数映射

使用函数映射时Numpy中的通用函数对Pandas对象同样有效

  • apply函数

    DataFrame.apply(function)

    可选参数: axis = 0/1

    函数也可以自定义

    function =  lambda x: x.min() - x.max()
    # 默认对每一列进行操作
    df.apply(function) 
  • applymap和map
    也可以applymap函数进行逐元素操作

    format = lambda x: '%2f" % x
    # 转换每个元素的格式
    df.applymap(format)

    applymap是对DataFrame进行操作,若要对Series的每个元素进行操作,可以使用map方法

    df.iloc[0].map(format)

排序和排名

  • sort_index 对索引排序
    sort_index可以对单个字母或数值类型索引进行排序

    DataFrame.sort_index(axis = 0/1, ascending=True/False)

    axis: 指定索引轴
    ascending: 是否升序

  • sort_values 对值排序
    默认情况下缺失值会被排序在Series的尾部

    Series.sort_values()
    DataFrame.sort_values(by = [columns])

    by: 参数用于指定列

  • rank 排名
    排名是将数据排序后,给数据分配一个名次,就像班级成绩的第几名一样

    Series.rank(method = ..., ascending = False/True)
    DataFrame.rank(axis = 0/1)

    axis=0是匹配行,对列进行排名;下面method参数的选项

    平级关系的方法 描述
    'average' 进行平均排名,相同数据会用平均数(默认)
    'min' 最小排名,相同数据用小的那个(例如两个第二名,没有第三名,直接到第四名)
    'max' 最大排名,相同数据用大的那个
    'first' 相同按数据出现次序排名
    'dense' 类似min,但名次不会间断(例如两个第二名,下一个是第三名)

统计与计算

  • 规约方法
    sum()mean()这类方法属于规约型方法,规约方法的可选参数如下

    方法 描述
    axis 0行向 1列向
    skipna 排除缺失值
    level 用于多层索引

    除了归约型还有累计型的方法,例如cumsum(),下面是一些常用的统计性方法的汇总

    方法 描述
    count 非NA的个数
    describe 计算各种信息的汇总集合
    min max 计算最值
    argmin argmax 计算最值索引位置
    idxmin idxmax 最值下表
    quantile 计算样本0~1之间的分位数
    sum 加和
    mean 均值
    median 中位数
    mad 平均值的平均绝对方差
    prod 所有值的积
    var 方差
    std 标准差
    skew 样本偏度(第三时刻)
    kurt 样本峰度(第四时刻)
    cumsum 累计值
    cummin cummax 累积值的最大、最小值
    cumpord 累计积
    diff 第一个算术差值(时间序列)
    pct_change 计算百分比
    corr 返回相关性矩阵
    cov 返回协方差矩阵
    corriwth DataFrame中的行或列对Series的相关性

    唯一值与计数

    前面给出了获得index唯一值的方法,要获得Series的唯一值可以使用unique方法,唯一值不会被排序,可以使用uniques.sort(),相应的,value_counts计算Series每个值的数量。isin对Series或DataFrame一列的数据进行检查,判断是否包含在参数中。相关的有Index.get_indexer方法,即对索引进行value_counts操作。

    Series.isin(['b', 'c'])  # 返回bool值列表
    Index.get_indexer(['a', 'b'])

数据载入与存储

  • 文本数据的读写
    pandas最常用的就是read_csvread_table函数,下面是常用函数表

    函数 描述
    read_csv 从文件 URL或文件类型对象读取有分隔的数据(默认,)
    read_table 从文件 URL或文件类型对象读取有分隔的数据(默认\t)
    read_fwf 从特定宽度格式文件读取数据(无分隔符)
    read_clipboard 同read_table,但是从剪贴板读取
    read_excel 从Excel的xls或xlsx文件读取表格数据
    read_hdf 读取pandas存储的HDF5文件
    read_html 从HTML文件读取表格数据
    read_json 从JSON字符串读取数据
    read_msgpack 读取MessagePack二进制格式的pandas数据
    read_pickle 读取python pickle格式存储的对象
    read_asa 读取SAS系统中定制存储格式的SAS数据集
    read_sql 将SQL查询结果读取为pandas的DataFrame
    read_stata 读取Stata格式数据集
    read_feather 读取Feather二进制格式
    • read_csv read_table函数

      pandas.read_csv('file_name', sep=',', header=None, names=[], index_col=[], na_values=['NULL'])

      参数:

      sep: 指定分隔符(默认csv就是逗号分隔的文本文件)
      header: 默认第一行为列名, None自动分配整数列名, 也可以指定某一行为列名
      names: 自己指定列名
      index_col: 选取某一列为index,默认index为0开始的整数(若要使用分层索引,则传入列表)
      na_values: 指定缺失值,也可以传入一个字典{'columns':['values']}来分别指定每列的补充值

      参数 描述
      path 文件路径、URL、文件对象
      spe 或 delimiter 可以是分隔符或正则表达式
      header 作为列名的行号(默认0,第一行为列名),None则为整数列名
      index_col 作为index的列名,默认index为0开始的整数(若要使用分层索引,则传入列表)
      names 指定列名列表,header=None一起用
      skiprows 跳过的行号列表
      skip_footer 跳过文件尾部的行数
      keip_blank_lines 是否跳过空白行(默认True)
      na_values 用于替换NA值的值
      comment 注释字符
      parase_dates 尝试将数据解析为datetime,默认False
      nrows 读入前n行
      parse_dates 若为True,则尝试解析数据框中的行索引。列表会被解析为日期列;嵌套列表会将某些列合并为日期列;字典会解析key对应的列为日期
      chunksize 用于迭代块的大小
      encoding Unicode文本编码
      squeeze 如果只有一行,返回Series
      thousands 千位分隔符
  • 分块读入文本文件

    在读取大文件时,可以调整pandas的显示pd.options.display.max_rows = 10
    为了分块读取文件,可以指定chunksize作为每一块的行数

    chunker = pd.read_csv('file.csv', chunksize=1000)

    read_csv返回的TextParse对象允许根据chunksize遍历文件

    tot = pd.Series([])
    for piece in chunker:
        tot = tot.add(piece['key'].value_counts(), fill_values=0)
    
    tot = tot.sort_values(sacending=False)
  • 将数据写入文本格式

    DataFrame.to_csv('file_name', spe='|', na_rep='NULL', index=False, header=False, columns=[])

    参数:

    若传入文件名,则保持到文件,也可以使用sys.stdout重定向输入到终端
    spe: 定义分隔符
    na_rep: 填充NaN值
    index: 是否写入索引
    header: 是否写入columns列索引
    colmuns: 根据列名列表,选择性写入某些列

  • 读取HDF5格式文件
    HDF5是一个用于存储大量科学数组数据的文件格式,以C库的形式提供,并有许多其他语言的接口,例如Java、Julia、MATAB和Python。HDF代表分层数据格式,HDF5支持多种压缩模式的及时压缩,并使用于处理无法读入内存的超大型数据。

  • 读取Excel文件

    xlsx = pd.ExcelFile('file.xlsx')
    pd.read_excel(xlsx, 'Sheet1') 
    # 或 pd.read_excel('file.xlsx', 'Sheet1')

    将pandas数据写入Excel数据中,必须先生成一个ExcelWriter,然后使用to_excel方法写入

    writer = pd.ExcelWriter('example.xlsx')
    DataFrame.to_excel(wirter, 'Sheet1') 
    writer.save() 
    # 或 pd.to_excel('example.xlsx')

处理缺失值

NA处理方法 描述
dropna 去除缺失值所在行列
fillna 填充缺失值 或 使用插值方法(例如'ffill' 'bfill')
isnull 是否为缺失值的布尔值
notnull 与isnull相反
  • 过滤缺失值
    使用dropna函数删除带有NA值的行

    DataFrame.dropna(how='all', axis=0/1)

    参数how为all会去掉全为NA的行,若要对列操作使用axis参数即可

  • 填充缺失值
    fillna用于填充缺失值

    DataFrame.fillna(0, inplace=False)

    fillna默认会返回一个新对象,而不是直接替代原对象,可以使用inplace=True直接填充原对象。除了填入单个值,也可以传入一个字典以对不同列设定不同的填充值。

    fillna参数 描述
    value 标量值或字典型对象用于填充缺失值
    method 插值方法,默认'ffill'
    axis 选取作用的轴,默认为0
    inplace 修改调用的对象,而不是生成一个备份
    limit 限制向前后填充的最大范围

数据转换

  • 删除重复值

    DataFrame.duplicated()
    DataFrame.drop_duplicated(['k1', 'k2'], keep='last')

    DataFrame.duplicated返回一个布尔值Series,反应每行是否重复(True)
    DataFrame.drop_duplicated去除重复行后返回DataFrame,也可以传入列名列表,根据某些列判断是否重复并去除重复行。 以上方法都保留第一次出现的值,使用参数keep='last' 保留最后重复出现的值。

  • 使用函数或映射进行数据转换

  • 替代值
    replace提供了更加直观的替换的特殊方法

    DataFrame.replace(a, b)

    这里将a替换成b,a可以为单个值,也可以是单个列表,将列表中值都替换为b

Clone this wiki locally