• [黑马程序员Pandas教程]——Pandas数据类型


    目录:

    1. 学习目标
    2. 一般类型
    3. 类型转换
      1. seriers.astype函数转换数据类型
        1. astype函数使用示例
        2. astype函数使用的坑
      2. pd.to_numeric函数字符串转数字类型
    4. category分类类型
      1. 创建分类类型
      2. 分类类型转换
    5. datetime时间类型
      1. Python中的datetime类型
      2. 读取数据时指定列为datetime类型
      3. pd.to_datetime将字符串转换为时间日期类型
      4. 提取datetime类型数据中具体时间
      5. datetime类型的Seriers进行时间计算
      6. datetime类型数据列作为df索引
    6. timedelta时间差类型
      1. Python中的timedelta类型
      2. Pandas中的timedelta类型
      3. pd.to_timedelta函数转换timedelta类型
      4. timedelta类型数据作为df索引
    7. 总结
      1. Pandas中的数据类型
      2. Pandas中数据结构和数据类型的关系
      3. Pandas数据类型转换基本方法
      4. category分类类型
      5. datetime时间类型
      6. timedelta时间差类型
    8. 项目地址

    1.学习目标

    • 知道Pandas中都有哪些数据类型和数据结构,并知道数据类型和数据结构之间的关系

    • 知道时间日期类型作为索引的数据集可以基于时间范围来选取子集

    • 知道时间差类型索引的数据集可以基于时间差范围来选取子集

     2.一般类型

    Pandas数据类型Python类型说明
    objectstr字符串
    int64int整数
    float64float浮点数
    boolbool布尔值
    category无原生类型分类类型
    datetime无原生类型时间日期类型
    timedelta无原生类型时间差类型
    • pandas是基于numpy构建的包,所以pandas中的数据类型都是基于Numpy中的ndarray类型实现的

    • Pandas中的数据结构对象和数据类型对象:

      • dataframe 表 【数据结构】

        • series 列【数据结构】

          • object --> python str 字符串 【数据类型】

          • int64 --> python int 整数 【数据类型】

          • float64 --> python float 小数 【数据类型】

          • bool --> python bool True False 【数据类型】

          • datetime64 --> python datetime 时间日期 【数据类型】

          • timedelta[ns]--> 两个时间点之间相距的时间差,单位是纳秒 【数据类型】

          • category --> 特定分类数据类型,比如性别分为男、女、其他 【数据类型】

    • 字符串object 、整数int、小数float 以及 布尔值bool类型都是比较常见的一般类型;本章节将详细介绍不常见的 分类类型、 时间类型 以及 时间差类型

    1. import pandas as pd
    2. # 加载印度城市空气质量数据集
    3. # index_col='Date' 指定Date列作为索引列
    4. # parse_dates=True 将Date列中的数据解析为时间类型
    5. city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')
    6. # 查看数据集各列及各自的数据类型
    7. print(city_day.info())

    3.类型转换

    • astype函数

    • to_numeric函数

    seriers.astype函数转换数据类型

    astype方法是通用函数,可用于把DataFrame中的任何列(Series)转换为其他dtype;可以向astype方法提供任何内置类型或numpy类型来转换列(Series)的数据类型

     astype函数使用示例
    1. import pandas as pd
    2. # 加载印度城市空气质量数据集
    3. # index_col='Date' 指定Date列作为索引列
    4. # parse_dates=True 将Date列中的数据解析为时间类型
    5. city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')
    6. print(city_day['PM2.5'].astype(str))
    7. print(city_day['PM2.5'].astype(object))
    astype函数使用的坑
    • astype函数要求DataFrame列的数据类型必须相同,当有些数据中有缺失,但不是NaN时(如'missing','null'等),会使整列数据变成字符串类型而不是数值型,这个时候就会报错
    1. import pandas as pd
    2. # 加载印度城市空气质量数据集
    3. # index_col='Date' 指定Date列作为索引列
    4. # parse_dates=True 将Date列中的数据解析为时间类型
    5. city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')
    6. city_day2 = city_day.head(10).copy()
    7. print(city_day2)
    8. # 创造包含'missing'为缺失值的数据,批量替换第1、3、5、7、9行中NO列的值为字符串'missing'
    9. city_day2.loc[::2, 'NO'] = 'missing'
    10. # 查看数据集
    11. print(city_day2)
    12. # 查看NO列的数据类型,返回dtype('O')表示object类型
    13. print(city_day2['NO'].dtypes)
    • 此时运行下面的代码会报错ValueError: could not convert string to float: 'missing',无法使用astype函数进行类型转换;这个时候我们可以使用to_numeric函数

    city_day2['NO'].astype(float)
    1. import pandas as pd
    2. city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')
    3. city_day2 = city_day.head(10).copy()
    4. city_day2.loc[::2, 'NO'] = 'missing'
    5. # 使用 to_numeric 函数转换 'NO' 列的值,无法转换的值会变为 NaN
    6. city_day2['NO'] = pd.to_numeric(city_day2['NO'], errors='coerce')
    7. print(city_day2['NO'].astype(float))
    pd.to_numeric函数字符串转数字类型
    • astype函数要求DataFrame列的数据类型必须相同,当有些数据中有缺失,但不是NaN时(如'missing','null'等),会使整列数据变成字符串类型而不是数值型,这个时候可以使用to_numeric处理
    • pd.to_numeric函数的参数errors, 它决定了当该函数遇到无法转换的数值时该如何处理

      • 默认情况下,该值为raise,如果to_numeric遇到无法转换的值时,会抛错

      • coerce: 如果to_numeric遇到无法转换的值时,会返回NaN

      • ignore: 如果to_numeric遇到无法转换的值时会放弃转换,什么都不做

    1. import pandas as pd
    2. city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')
    3. city_day2 = city_day.head(10).copy()
    4. print(city_day2)
    5. city_day2.loc[::2, 'NO'] = 'missing'
    6. # 无法转换的值返回NaN
    7. print(pd.to_numeric(city_day2['NO'], errors='coerce'))
    8. # 无法转换的值返回原值
    9. print(pd.to_numeric(city_day2['NO'], errors='ignore'))

     4.category分类类型

    • 比较特殊数据类型,是由固定的且有限数量的变量组成的,比如性别,分为男、女、保密;转换方法可以使用astype函数

    • category类型的数据中的分类是有顺序的

    创建分类类型
    • 方式1

    1. s = pd.Series(
    2. pd.Categorical(
    3. ["a", "b", "c", "d"],
    4. categories=["c", "b", "a"]
    5. )
    6. )
    7. s
    8. # 输出结果如下
    9. 0 a
    10. 1 b
    11. 2 c
    12. 3 NaN
    13. dtype: category
    14. Categories (3, object): ['c', 'b', 'a']
    • 方式2

    1. s2 = pd.Series(['B','D','C','A'], dtype='category')
    2. s2
    3. # 输出结果如下
    4. 0 B
    5. 1 D
    6. 2 C
    7. 3 A
    8. dtype: category
    9. Categories (4, object): ['A', 'B', 'C', 'D']
    分类类型转换
    1. s.astype(str)
    2. # 输出结果如下
    3. 0 a
    4. 1 b
    5. 2 c
    6. 3 nan
    7. dtype: object

     5.datetime时间类型

    Python中的datetime类型
    1. from datetime import datetime
    2. now = datetime.now()
    3. someday = datetime(2020, 1, 1)
    4. print(now)
    5. print(someday)
    读取数据时指定列为datetime类型
    • 读取数据集时,使用参数parse_dates=[列下标]直接将转为datetime类型

    1. import pandas as pd
    2. df = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=[1])
    3. print(df['Date'])
    pd.to_datetime将字符串转换为时间日期类型
    1. import pandas as pd
    2. # 正常加载数据集
    3. df = pd.read_csv('../datas/data_set/city_day.csv')
    4. # 查看Date列数据类型
    5. print(df['Date'])
    6. # 将Date列数据转换为时间类型
    7. df['Date'] = pd.to_datetime(df['Date'])
    8. print(df['Date'])
    提取datetime类型数据中具体时间
    • 由datetime构成的Seriers提取时间日期中的各个部分

    1. import pandas as pd
    2. # 正常加载数据集
    3. df = pd.read_csv('../datas/data_set/city_day.csv')
    4. df['Date'] = pd.to_datetime(df['Date'])
    5. # 报错
    6. # print(df['Date'].year)
    7. print(df['Date'].dt.year)
    8. print(df['Date'].dt.month)
    9. print(df['Date'].dt.day)
    10. print(df['Date'].dt.hour)
    11. print(df['Date'].dt.minute)
    12. print(df['Date'].dt.second)
    13. # 季度
    14. print(df['Date'].dt.quarter)
    15. # 星期,与 df['Date'].dt.weekday+1 相同
    16. print(df['Date'].dt.dayofweek + 1)
    17. # 星期
    18. print(df['Date'].dt.weekday + 1)
    • 由datetime构成的Seriers的其中一个数据提取时间日期中的各个部分

    1. import pandas as pd
    2. # 正常加载数据集
    3. df = pd.read_csv('../datas/data_set/city_day.csv')
    4. df['Date'] = pd.to_datetime(df['Date'])
    5. # d ==> Timestamp('2020-06-20 00:00:00')
    6. d = pd.to_datetime('2020-06-20')
    7. print(d)
    8. print(d.year)
    9. print(d.month)
    10. print(d.day)
    11. print(d.hour)
    12. print(d.minute)
    13. print(d.second)
    14. # 季度
    15. print(d.quarter)
    16. # 星期几,与d.dayofweek相同 0是星期一 1是星期二 6是星期日
    17. print(d.weekday())
    18. print(d.dayofweek + 1)
    datetime类型的Seriers进行时间计算
    • datetime类型的日期可以直接进行时间计算:

      • 可以直接使用聚合函数

      • 也可以直接进行时间差运算

    1. import pandas as pd
    2. # 正常加载数据集
    3. df = pd.read_csv('../datas/data_set/city_day.csv')
    4. df['Date'] = pd.to_datetime(df['Date'])
    5. # 直接调用聚合函数
    6. # 返回 Timestamp('2015-01-01 00:00:00')
    7. print(df['Date'].min())
    8. # 直接进行时间差运算
    9. # 返回时间差类型数据构成的Seriers
    10. print(df['Date'] - df['Date'].min())
    datetime类型数据列作为df索引
    • datetime类型数据列作为df索引可以通过具体的时间查询df子集

    1. import pandas as pd
    2. # 加载数据集,设定时间类型列为索引列
    3. df = pd.read_csv('../datas/data_set/city_day.csv', index_col='Date', parse_dates=True)
    4. # 对索引进行重新排序
    5. # 必要步骤
    6. df = df.sort_index()
    7. print(df)
    8. # 索引排序之后,才能按年取子集df
    9. print(df.loc['2018-01-01':'2018-12-31'])
    10. # # 按年月取子集df:所有符合条件的完整行数据
    11. print(df.loc['2016-06-01':'2016-06-30'])
    12. # # 按时间范围取子集
    13. print(df.loc['2015-3-4 22': '2016-1-1 23:45:00'])

    6.timedelta时间差类型

    Python中的timedelta类型
    • python没有原生的timedelta数据类型,需要使用datetime包

    1. from datetime import datetime
    2. t1 = datetime.now()
    3. t2 = datetime(2020, 1, 1)
    4. diff = t1 - t2
    5. # 时间差类型
    6. # datetime.timedelta(days=600, seconds=67613, microseconds=847617)
    7. print(diff)
    Pandas中的timedelta类型
    • 两个时间Seriers相减即可得到timedelta类型数据构成的Seriers对象

    1. import pandas as pd
    2. # 加载数据,指定下标为1的列为时间日期类型
    3. df2 = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=[1])
    4. # 当前日期减去数据集中最早的日期,即可得到时间差;同时赋值给新的列
    5. df2['ref_date'] = df2['Date'] - df2['Date'].min()
    6. # 查看
    7. print(df2['ref_date'])

     

    pd.to_timedelta函数转换timedelta类型
    • timedelta类型转换为字符串类型

    1. import pandas as pd
    2. # 加载数据,指定下标为1的列为时间日期类型
    3. df2 = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=[1])
    4. # 当前日期减去数据集中最早的日期,即可得到时间差;同时赋值给新的列
    5. df2['ref_date'] = df2['Date'] - df2['Date'].min()
    6. s1 = df2['ref_date'].astype(str)
    7. print(s1)
    • 字符串类型转换为timedelta类型

    1. import pandas as pd
    2. # 加载数据,指定下标为1的列为时间日期类型
    3. df2 = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=[1])
    4. # 当前日期减去数据集中最早的日期,即可得到时间差;同时赋值给新的列
    5. df2['ref_date'] = df2['Date'] - df2['Date'].min()
    6. s1 = df2['ref_date'].astype(str)
    7. print(s1)
    8. s2 = pd.to_timedelta(s1)
    9. print(s2)
    timedelta类型数据作为df索引
    • 如果将timedelta类型数据作为df索引,就可以基于时间差范围来选择数据

    1. import pandas as pd
    2. # 读取数据,并将下标为1的Date列设为时间类型列
    3. df3 = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=[1])
    4. # 获取印度城市德里的子集
    5. df4 = df3.query('City=="Delhi"')
    6. # 将timedelta类型的Series设置为df的索引
    7. # df4.索引 = Date列 - Date列最早的那一天
    8. df4.index = df4['Date'] - df4['Date'].min()
    9. # 查看数据集
    10. print(df4.head())
    11. # 基于时间差范围来选择数据
    12. print(df4['0 days':'4 days'])

    7.总结

    Pandas中的数据类型
    Pandas数据类型Python类型说明
    objectstr字符串
    int64int整数
    float64float浮点数
    boolbool布尔值
    category无原生类型分类类型
    datetime无原生类型时间日期类型
    timedelta无原生类型时间差类型
    Pandas中数据结构和数据类型的关系
    • pandas是基于numpy构建的包,所以pandas中的数据类型都是基于Numpy中的ndarray类型实现的

    • Pandas中的数据结构对象和数据类型对象:

      • dataframe 表 【数据结构】

        • series 列【数据结构】

          • object --> python str 字符串 【数据类型】

          • int64 --> python int 整数 【数据类型】

          • float64 --> python float 小数 【数据类型】

          • bool --> python bool True False 【数据类型】

          • datetime64 --> python datetime 时间日期 【数据类型】

    • timedelta[ns]--> 两个时间点之间相距的时间差,单位是纳秒 【数据类型】

    • category --> 特定分类数据类型,比如性别分为男、女、其他 【数据类型】

    Pandas数据类型转换基本方法
    • df['列名'].astype(str)

    • 当Seriers对象使用astype函数转换的结果中数据类型不同时,使用to_numeric函数

      • pd.to_numeric(df['列名'], errors='coerce')无法转换的值返回NaN

      • pd.to_numeric(df['列名'], errors='ignore') 无法转换的值返回原值

     

    category分类类型
    • 创建方式s = pd.Series(['B','D','C','A'], dtype='category')

    datetime时间类型
    • datetime时间类型的Seriers来源两种方式:

      • 读取时指定 df = pd.read_csv('..xxx.csv', parse_dates=[1])

      • 转换 df['Date'] = pd.to_datetime(df['Date'])

    • 提取datetime时间类型的Seriers中的具体年月日时分秒星期

      • df['Date'].dt.year

      • df['Date'].dt.quarter # 季度

      • df['Date'].dt.dayofweek+1 # 星期

    • 提取datetime时间类型的Seriers中的某一个值的具体年月日时分秒星期

      • df4['Date'][0].dayofweek+1 # 星期

    • datetime时间类型的Seriers可以进行时间计算

      • 直接调用聚合函数 df['Date'].max() # 最近的日期

      • 计算时间差 df['Date'] - df['Date'].min() # 返回时间差类型数据构成的Seriers

    • datetime时间类型的S对象作为索引的两种方式

      • df = pd.read_csv('..xxx.csv', index_col='Date', parse_dates=True)

      • df.index = df['date']

      • 注意:要对索引进行重新排序 必要步骤 df = df.sort_index()

    • datetime时间类型索引可以按照时间范围取子集

      • df['2018']

      • df['2016-06']

      • df.loc['2015-3-4 22': '2016-1-1 23:45:00']

    timedelta时间差类型
    • timedelta时间差类型的创建:

      • df['date_diff'] = df['Date'] - df['Date'].min()

    • 字符串类型转换为时间差类型

      • s2 = pd.to_timedelta(s1)

    • timedelta时间差类型设为索引

      • df.index = df['Date'] - df['Date'].min()

    • 基于时间差范围来选择数据

      • df['0 days':'4 days']

    8.项目地址

    Python: 66666666666666 - Gitee.com

  • 相关阅读:
    【操作系统】文件系统之文件共享与文件保护
    Redis数据类型
    go-mysql-elasticsearch 使用
    配置与管理DHCP服务器练习题
    关于循环浅析
    STM32外部Flash移植FATFS笔记
    商场会员营销系统 购物中心会员精细化运营体系
    ES6中 Promise 概念、基本用法和封装ajax(json数据使用)
    DAY-2 | 哈希表、指针与区间划分:字符种数统计问题
    【MySQL入门】第三话 · MySQL中常见的数据类型
  • 原文地址:https://blog.csdn.net/qq_56444564/article/details/134288624