【机器学习】Pandas的基本使用

Pandas介绍

Pandas是专门用于数据挖掘的开源Python库。以Numpy为基础,具有良好的计算性能;基于Matplotlib,能够简便地绘图;还有自带独特的数据结构

Pandas优势:

  • 增强图表的可读性
  • 便捷的数据处理能力
  • 读取文件方便
  • 封装了Matplotlib和Numpy的绘图和计算

Pandas数据结构

Pandas的数据结构主要有三种:

  1. Series:一维数据结构
  2. Dataframe:二维表格型数据结构
  3. MultiIndex(老版本叫Pannel):三维数据结构

Series

Series是一个类似与一维数组的数据结构,它能保存任意类型的数据,如整数浮点数字符串等,主要由一组数据和与之相关的索引两部分构成

  • Series的创建

    import pandas as pd
    
    pd.Series(data=None, index=None, dtype=None)
    

    参数:

    • data:传入的数据,可以是ndarray、list等
    • index:索引,必须唯一且与数据的长度相等。如果没有传入索引参数,则默认会自动创建一个从0~n的整数索引
    • dtype:数据的类型

    通过已有数据创建:

    # 指定内容,默认索引
    pd.Series(np.arrange(10))
    
    # 指定索引
    pd.Series([1,2,3,4,5], index=[0,1,2,3,4])
    

    通过字典数据创建:

    count = pd.Series({'red':100, 'blue':200, 'green':500, 'yellow':1000})
    
  • Series的属性:
    为了更方便地操作Series对象中的索引和数据,Series中提供了两个属性index和values

    • index

      # 获取全部索引
      count.index
      
    • values

      # 获取全部数据
      count.values
      

DataFrame

  • DataFrame的创建

    # 导入pandas
    import pandas as pd
    
    pd.DataFrame(data=None, index=None, columns=None)
    

    参数:

    • index:行标签,如果没有传入则默认0~n
    • columns:列标签,默认0~n

    创建实例:

    # 创建两行三列0-1之间的随机数表
    pd.DataFrame(np.random.randn(2,3))
    
    # 创建学生成绩表
    score = np.random.randint(40, 100, (10, 5)) # 成绩
    subjects = ["英语", "数学", "专业课", "政治"] # 科目
    stu = [str(i + 1) + '号考生' for i in range(10)] # 学生
    data = pd.DataFrame(score, columns=subjects, index=stu)
    
  • DataFrame的属性

    • Shape

      # 获取DataFrame的形状
      data.shape
      
    • index

      # 获取行索引列表
      data.index
      
    • columns

      # 获取列索引列表
      data.columns
      
    • values

      # 直接获取其中的值
      data.values
      
    • T

      # 返回转置的表格
      data.T
      
    • head(n)

      # 返回前5行数据
      data.head(5)
      
    • tail(n)

      # 返回后5行数据
      data.tail(5)
      
  • DataFrame索引设置
    注意:修改行列索引值的时候必须整体全部修改,不能只改单个

    • 直接修改行列索引值

      stu = ["学生" + str(i) for i in range(10)]
      data.index = stu
      
      
  - 重置索引
  
    ```python
      data.reset_index(drop=False) # drop表示是否删除原来索引,True删False不删
  • 以某列为索引

    df = pd.DataFrame({'month':[1,4,7,10],'year':[2012,2014,2016,2018], 'sale':[31,40,55,84]})
    df.set_index('month') # 以month为索引
    df.set_index(['month', 'year']) # 设置多个索引,以年和月份,变成了MultiIndex的DataFrame
    

MultiIndex

MultiIndex是一个三维的数据结构:多级索引(也称层次化索引)是pandas的重要功能,可以在Series、DataFrame对象上拥有2个以及2个以上的索引

  • MultiIndex的特性

    # 接上个代码块,df为设置了多个索引的DataFrame
    df.index # 查看索引结果
    

    index属性

    • names:levels的名称

      df.index.names
      
    • levels:每个level的元组值

      df.index.levels
      
  • MultiIndex的创建

    arrays = [[1,1,2,2], ['red','blue','red','blue']]
    pd.MultiIndex.from_arrays(arrays, names=('number', 'color'))
    

基本数据操作

索引操作

Numpy中可以使用索引选取序列和切片选择,Pandas也支持类似的操作,也可以直接使用列名称和行名称,甚至组合使用

  • 直接使用行列索引(先列后行)
    例:获取‘2018-02-27’这天的‘close’的结果

    # 直接使用行列索引名字的方式(切记是先列后行)
    data['close']['2018-02-27']
    
    # 不支持的操作:
    data['2018-02-27']['close'] # 报错,pandas索引先列后行
    data[:1, :2] # 报错,pandas不支持直接切片
    
  • 结合loc或iloc使用索引
    例:获取从‘2018-02-27’到‘2018-02-22’,‘open’的结果

    # 使用loc:只能指定行列索引的名字
    # 注意loc使用的是先行后列的索引
    data.loc['2018-02-27':'2018-02-22', 'open']
    
    # 使用iloc: 可以通过索引的下标去获取
    # 获取前3天的数据,前5列的结果
    data.iloc[:3, :5] # 同样是先行后列
    
  • 使用ix组合索引(不推荐)
    例:获取行第1天到第4天,[‘open’, ‘close’, ‘high’, ‘low’]这四个指标的结果

    # 使用ix进行小标和名称组合的索引
    data.ix[0:4, ['open', 'close', 'high', 'low']]
    
    # 推荐使用loc或iloc写法
    data.loc[data.index[0:4], ['open', 'close', 'high', 'low']]
    
    data.iloc[0:4, data.columns.get_indexer(['open', 'close', 'high', 'low'])]
    

赋值操作

例:对DataFrame当中的close列重新赋值为1

# 直接修改原来的值
data['close'] = 1
# 或者通过.的方式赋值
data.close = 1

排序操作

排序有两种方式,一种对于索引进行排序,一种对于内容进行排序

  • DataFrame排序

    • 使用df.sort_values(by=, ascending=)通过单个键或多个键对按大小对内容排序

      • 参数:

        1. by: 指定排序参考的键
        2. ascending: False为降序,True为升序,默认升序
      • 实例:

        # 单个键
        data.sort_values(by="open", ascending=True)
        # 多个键
        data.sort_values(by=['open', 'high'])
        
    • 使用df.sort_index给索引进行排序

      # 对索引进行排序
      data.sort_index()
      
  • Series排序

    • 使用Series.sort_values(ascending=True)进行排序

      # Series排序时,只有一列,不需要参数
      data['date'].sort_values(ascending=True)
      
    • 使用Series.sort_index()进行排序

      # 与DataFrame一致
      data['date'].sort_index()
      

Dataframe运算

算术运算

  • df['column'].add(Number)为某列所有数加上一个数
  • df['column'].sub(Number)为某列所有数减去一个数

逻辑运算

  • 逻辑运算符号:

    & 逻辑与 | 逻辑或 ~ 逻辑非

    > 大于 >= 大于等于 < 小于 <= 小于等于

  • 逻辑运算函数:

    • query(expression string)

      # 用于查询某些内容
      data.query("number > 5 & number < 10")
      
    • isin(values)

      # 可以指定值进行判断,用于进行元素的筛选
      data[data["column"].isin([12.5, 40.5])] # 筛选值在 12.5 - 40.5 这个区间内的数据
      

统计运算

  • describe函数:用于数据综合分析,能够直接得出很多统计结果,如count、mean、std、min、max等

    data["column"].describe() # 直接输出统计结果
    
  • 统计函数:

    函数介绍
    sum([axis=0])累加求和函数
    mean([axis=0])求均值函数
    median([axis=0])求中位数函数
    min([axis=0])求最小值函数
    max([axis=0])求最大值函数
    mode([axis=0])求众数函数
    abs([axis=0])求绝对值函数
    prod([axis=0])累乘求积函数
    std([axis=0])求标准差函数
    var([axis=0])求方差函数
    idxmax([axis=0])返回最大值的索引值
    idxmin([axis=0])返回最小值的索引值

    **注意:**使用统计函数时需要明确指定axis,也就是轴。当axis=0(默认)时按列统计,axis=1时按行统计

  • 累计统计函数:

    函数介绍
    cumsum计算前n个项之和
    cummax计算前n个项的最大值
    cummin计算前n个项的最小值
    cumprod计算前n个项的积

自定义运算

当Pandas和Numpy内置的函数无法满足业务需求时,需要自定义函数来执行这些特殊的业务逻辑(如某两个列相乘后和第三个列相加……)

# API
df[[column1, column2, ……]].apply(func, axis=0) # 注意:func可传函数名或lambda表达式

# 实例:定义一个某列的最大值减去该列的最小值的函数
data[["col1", "col2"]].apply(lambda x: x.max() - x.min(), axis=0)

Pandas绘图

Pandas.DataFrame.plot

写法:DataFrame.plot(kind='str')
参数:kind='str', 表示绘图的种类,取值包括:

  • ‘line’:折线图(默认)
  • ‘bar’:柱状图
  • ‘barh’:水平柱状图
  • ‘hist’:频率分布直方图
  • ‘pie’:饼图
  • ‘scatter’:散点图

Pandas.Series.plot

写法:Series.plot(kind='str')
参数:kind='str'取值包括:

  • ‘line’:折线图(默认)
  • ‘bar’:柱状图
  • ‘barh’:水平柱状图
  • ‘hist’:频率分布直方图
  • ‘pie’:饼图
  • ‘scatter’:散点图

**注意:**plot函数绘制完图后,需要使用plt.show()才能让图像显示出来,并且需要提前引入matplotlib.pyplot

文件读取与存储

Pandas支持复杂的IO操作,提供的API支持众多文件格式:

编码类型数据描述读取API写入API
文本csvread_csvto_csv
文本jsonread_jsonto_json
文本htmlread_htmlto_html
文本local clipboardread_clipboardto_clipboard
二进制excelread_excelto_excel
二进制hdfread_hdfto_hdf
二进制fetherread_fetherto_fether
二进制parquetread_parquetto_parquet
二进制msgpackread_msgpackto_msgpack
二进制stataread_statato_stata
二进制sasread_sas
二进制python pickleread_pickleto_pickle
SQLsqlread_sqlto_sql
SQLgoogle big queryread_gbqto_gbq

下面介绍几种常用的读写API

读写CSV格式文件

# 读取操作
# 指定文件目录和分隔符以及要读取的列,后面两个参数可省略
pandas.read_csv('file_path', sep=',', usecols=['col1', 'col2'])

# 写入操作
# 指定文件目录、分隔符、要写入的列、是否写入列的索引值、是否写入行的索引值、重写'w'或追加'a',以及编码格式,只有文件目录参数不可省略
DataFrame.to_csv('file_path', sep',', columns=None, header=True, index=True, mode='w', encoding=None)

读写JSON格式文件

# 读取操作
pandas.read_json('file_path', orient='', typ='', lines=False)
  • orient取值:
    • ‘split’:将索引整合到索引,列名整合到列名,数据整合到数据,三部分分开
    • ‘records’:以columns: values形式输出
    • ‘index’:以index: {columns: values}形式输出
    • ‘columns’:以columns: {index: values}形式输出
    • ‘values’:直接输出数据,没有行索引和列索引
  • typ取值:
    • 默认’frame’,指定转换成的对象类型是Series还是DataFrame
  • lines取值:
    • 默认False,逐行读取json对象
# 写入操作
pandas.to_json('file_path', orient='', lines=False) # 参数取值同上

高级处理

缺失值处理

  • 使用isnull()、notnull()函数判断是否有缺失数据NaN
  • 使用fillna()函数实现缺失值的填充
  • 使用dropna()函数实现对缺失数据的删除
  • 使用replace()函数实现数据的替换

数据离散化

​ 数据离散化就是将大量的数据按照某些等长区间进行划分,然后统计这些数据落在区间内的个数。

  • API:

    # 自行分组(自动分成差不多数量的类别)
    qcut = pd.qcut(df['col1'], 10) # 参数: 哪些数据,分几组
    # 计算分到每个组数据的个数
    qcut.value_counts()
    
    # 自定义区间分组
    bins = [1,3,5,7,9,11,13,17,19]
    qcut = pd.qcut(df['col1'], bins) # 将自定义的区间传入
    qcut.value_counts()
    
  • one-hot编码:

    # pd.get_dummies(data, prefix=None) # prefix是分组名字
    dummies = pd.get_dummies(df['col2'], prefix="Top")
    

合并

如果你的数据由多张表组成,那么有时候需要将不同的内容合并到一起进行分析

  • API:

    # pd.concat() 实现数据合并
    pd.concat([data1, data2], axis=1) # 按行或列进行合并,列0行1
    
    # pd.merge() 实现数据合并
    pd.merge(data1, data2, how='inner', on=None) # 类似数据表的连接,left join, right join, innner join, outer join,how指定连接方式(默认内连接),on指定共同的键 
    

交叉表与透视表

  • 交叉表:用于计算一列数据对于另一列数据的分组个数统计(用于统计分组频率的特殊透视表)

    • API:

      pd.crosstab(df['col1'], df['col2']) # 传入相同表的两个不同列,结果是数值
      
  • 透视表:将原有的DataFrame的列分别作为行索引和列索引,然后对指定的列应用聚集函数

    • API:

      # data.pivot_table()
      DataFrame.pivot_table(['需要统计的列'], index='统计所依照的索引') # 结果是百分比
      

分组与聚合

分组是为了更好的聚合运算

  • API:

    DataFrame.groupby(key, as_index=False)
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值