在处理数据时,可能会遇到
数据类型不一致
的问题。例如,通过爬虫采集到的数据都是整型的数据,在使用数据时希望保留两位小数点,这时就需要将数据的类型转换成浮点型。
创建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
:错误采取的处理方式,可以取值为raise
或ignore
。其中,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类型生效