【pandas 数据类型转换 :astype()和to_numeric()用法】

在处理数据时,可能会遇到数据类型不一致的问题。例如,通过爬虫采集到的数据都是整型的数据,在使用数据时希望保留两位小数点,这时就需要将数据的类型转换成浮点型。

创建Pandas数据对象时,如果没有明确地指出数据的类型,则可以根据传入的数据推断出来,并且通过dtypes属性进行查看。

df = pd.DataFrame({'A':['5', '6', '7'], 'B':['3', '2', '1']})

# 查看数据的类型
df.dtypes
#   A     object
#   B     object
#   dtype: object

还可以在创建Pandas对象时明确地指定数据的类型,即在使用构造方法中的dtype参数指定数据的类型。

df = pd.DataFrame({'A': ['5', '6', '7'],
  		           'B': ['3', '2', '1']},dtype='int')
df.dtypes
#    A    int32
#	 B    int32
#  	dtype: object

通过astype()方法可以强制转换数据的类型。

astype(dtype,copy = True,errors ='raise'** kwargs )

dtype:表示数据的类型。
errors:错误采取的处理方式,可以取值为raiseignore。其中,raise表示允许引发异常,ignore表示抑制异常,默认为raise

astype()方法存在着一些局限性,只要待转换的数据中存在非数字以外的字符,在使用astype()方法进行类型转换时就会出现错误,而to_numeric()函数的出现正好解决了这个问题。

to_numeric()函数可以将传入的参数转换为数值类型

pandas.to_numeric(arg, errors='raise', downcast=None)
  • arg:表示要转换的数据,可以是list、tuple、Series
  • errors:表示错误采取的处理方式。
  • downcast:指定转换的类型,默认返回float64或int64
参数 描述
arg scalar, list, tuple, 1-d array, or Series
errors {‘ignore’, ‘raise’, ‘coerce’}, default ‘raise’
downcast {‘integer’, ‘signed’, ‘unsigned’, ‘float’}
import pandas as pd
import numpy as np
s = pd.Series(['apple', '1.0', '2','2019-01-02',1, False,None,pd.Timestamp('2018-01-05')])

# to_numeric是在object,时间格式中间做转换,然后再使用astype做numeric类型的内部转换
pd.to_numeric(s, errors='raise') # 遇到非数字字符串类型报错,bool类型报错,时间类型转换为int
pd.to_numeric(s, errors='ignore') # 只对数字字符串转换,其他类型一律不转换,包含时间类型
pd.to_numeric(s, errors='coerce')  # 将时间字符串和bool类型转换为数字,其他均转换为NaN

# downcast 可以进一步转化为int或者float
pd.to_numeric(s) # 默认float64类型
pd.to_numeric(s, downcast='signed') # 转换为整型

# astype中的error没有`coerce`选项,所以只适合`numeric`内部类型的转换,比如将int32转换为int64,int32转换为float32
# 而不适合在object,时间格式之间做转换,
s.astype('int32',errors='raise')
s.astype('int32',errors='ignore')  # 对object无效,astype只能对numeric类型生效

你可能感兴趣的:(pandas,python)