zoukankan      html  css  js  c++  java
  • Python学习笔记:Pandas数据类型转化

    一、Pandas读取剪切板数据

    import pandas as pd
    df = pd.read_clipboard()
    '''
    	国家	受欢迎度	评分	向往度
    0	中国	10	10.0	10.0
    1	美国	6	5.8	7.0
    2	日本	2	1.2	7.0
    3	德国	8	6.8	6.0
    4	英国	7	6.6	NaN
    '''
    df.dtypes
    '''
    国家       object
    受欢迎度      int64
    评分      float64
    向往度     float64
    dtype: object
    '''
    
    • object 类型
    • int 整数类型
    • float 浮点数类型
    • string 字符串类型

    二、加载数据时指定数据类型

    最简单的加载数据: pd.DataFrame(data)pd.read_csv(file_name)

    # 读取数据时指定
    import pandas as pd
    df = pd.read_csv('data.csv',
                    dtype={
                        'a':'string',
                        'b':'int64'
                    })
    
    # 创建 DataFrame 类型数据时通过 dtype 参数设定
    df = pd.DataFrame({
        'a':[1,2,3],
        'b':[4,5,6]
    },
    dtype='float32'
    )   
    df  
    '''
    a	b
    0	1.0	4.0
    1	2.0	5.0
    2	3.0	6.0
    '''
    

    三、astype转换数据类型

    df.受欢迎度.astype('float')
    
    df.astype({'国家':'string',
              '向往度':'Int64'})
    

    四、pd.to_xx 转换数据类型

    • to_datetime
    • to_numeric
    • to_pickle
    • to_timedelta

    4.1 pd.to_datetime 转换为时间类型

    • 转换为日期
    • 转换为时间戳
    • 按照 format 转换为日期
    pd.to_datetime(date['date'], format="%m%d%Y")
    

    针对日期列混合多种日期类型,可考虑:

    # 添加日期长度辅助列
    df['col'] = df['date'].apply(len)
    df_new = df.loc[df['col'] > 10]
    df_new['col2'] = pd.to_datetime(df_new['date'], format="%m%d%Y")
    

    另外两种方式均可实现:

    # 转换时遇到不能转换的数据转化为 NaN
    df['date_new'] = pd.to_datetime(df['date'], format="%m%d%Y", errors='coerce')
    # 尝试转换为日期类型
    df['date_new'] = pd.to_datetime(df['date'], infer_datetime_format=True)
    

    实例:

    # 转换日期
    ss = pd.Series(['3/11/2000', '3/12/2000', '3/13/2000'])
    pd.to_datetime(ss, format="%m/%d/%Y")
    pd.to_datetime(ss, infer_datetime_format=True) # 自动识别
    
    # 转换时间戳
    aa = pd.Series([1490195805, 1590195805, 1690195805])
    pd.to_datetime(aa, unit='s')
    bb = pd.Series([1490195805433502912, 1590195805433502912, 1690195805433502912])
    pd.to_datetime(bb, unit='ns')
    
    # 转换字符串
    cc = pd.Series(['20200101', '20200202', '202003'])
    pd.to_datetime(cc, format='%Y%m%d', errors='ignore') # 不转换
    pd.to_datetime(cc, format='%Y%m%d', errors='coerce') # 错误置为 NaT
    

    需要注意的是,对于上述时间戳的日期转化,起始时间默认是1970-01-01对于国内时间来说会相差8小时, 可以手动加上。

    print(pd.to_datetime(aa, unit='s'))
    print(pd.to_datetime(aa, unit='s', origin=pd.Timestamp('1970-01-01 08:00:00'))) # 指定起始时间
    print(pd.to_datetime(aa, unit='s') + pd.Timedelta(days=8/24)) # 手动加上8小时
    '''
    0   2017-03-22 15:16:45
    1   2020-05-23 01:03:25
    2   2023-07-24 10:50:05
    dtype: datetime64[ns]
    0   2017-03-22 23:16:45
    1   2020-05-23 09:03:25
    2   2023-07-24 18:50:05
    dtype: datetime64[ns]
    0   2017-03-22 23:16:45
    1   2020-05-23 09:03:25
    2   2023-07-24 18:50:05
    dtype: datetime64[ns]
    '''
    

    4.2 pd.to_numeric 转换为数字类型

    # 语法
    pd.to_numeric(data, errors='raise', downcast=None)
    
    • errors:默认'raise',处理错误的方式,可选{‘ignore’, ‘raise’, ‘coerce’};
      • ‘ignore’:无效的转换将返回输入;
      • ‘raise’:无效的转换将引发异常;
      • ‘coerce’:无效的转换将设为NaN;
    • downcast:默认None,可选{‘integer’, ‘signed’, ‘unsigned’, ‘float’};如果不是None,并且数据已成功转换为数字数据类型,则根据一定规则将结果数据向下转换为可能的最小数字数据类型;‘integer’ 或 ‘signed’: 最小的有符号整型(numpy.int8);‘unsigned’: 最小的无符号整型(numpy.uint8);‘float’: 最小的浮点型(numpy.float32);
    data = pd.Series(['1.0','2',-100])
    print(data)
    print(pd.to_numeric(data))
    print(pd.to_numeric(data, downcast='signed'))
    
    data2 = pd.Series(['apple', '1.0', '2', -100])
    print(pd.to_numeric(data2, errors='ignore')) # 不转换
    print(pd.to_numeric(data2, errors='coerce')) # 错误以NaN替换
    

    4.3 pd.to_timedelta 转换为时间差类型

    将数字、时间差字符串like等转化为时间差数据类型。

    import numpy as np
    print(pd.to_timedelta(np.arange(5), unit='d'))
    # TimedeltaIndex(['0 days', '1 days', '2 days', '3 days', '4 days'], dtype='timedelta64[ns]', freq=None)
    
    print(pd.to_timedelta('1 days 06:06:01.00003'))
    # 1 days 06:06:01.000030
    
    pd.to_timedelta(['1 days 06:05:01.00003', '15.5us', 'nan'])
    # TimedeltaIndex(['1 days 06:05:01.000030', '0 days 00:00:00.000015500', NaT], dtype='timedelta64[ns]', freq=None)
    

    五、智能判断数据类型

    convert_dtypes 方法可以用来进行比较智能的数据类型转换。

    print(df.dtypes)
    '''
    国家            object
    受欢迎度           int64
    评分           float64
    向往度          float64
    over_long      int64
    dtype: object
    '''
    dfn = df.convert_dtypes()
    print(dfn.dtypes)
    '''
    国家            string
    受欢迎度           Int64
    评分           Float64
    向往度            Int64
    over_long      Int64
    dtype: object
    '''
    

    六、数据类型筛选

    select_dtypes() 实现按照字段数据类型筛选。

    df.select_dtypes(include=None, exclude=None) -> 'DataFrame'
    
    • 数字:number、int、float
    • 布尔:bool
    • 时间:datetime64
    • 时间差:timedelta64
    • 类别:category
    • 字符串:string
    • 对象:object
    df.select_dtypes(include='float')
    df.select_dtypes(include='number')
    df.select_dtypes(include=['int','object'])
    df.select_dtypes(exclude='object')
    

    参考链接:5招学会Pandas数据类型转化

  • 相关阅读:
    [css]继承关系(一)
    Trie树-提高海量数据的模糊查询性能
    [C]struct结构化数据的一些要点
    [C]表达式结合规律和运算符优先级
    [C]副作用和序列点
    [C]链接和生存周期
    [PHP]关于连接MySQL的问题
    IT网址大全
    VUE 生命周期
    Vue 组件间传值
  • 原文地址:https://www.cnblogs.com/hider/p/15273115.html
Copyright © 2011-2022 走看看