pandas(8):数据类型转换
目录
不同的数据类型可以用不同的处理方法。合适的数据类型,才能更高效处理数据。一个列只能有一个总数据类型,但具体值可以是不同的数据类型。源Excel文件pandas_dtypes.csv:
![image](https://img2020.cnblogs.com/blog/2104707/202104/2104707-20210424152826512-501473559.png)
df = pd.read_csv(r"pandas_dtypes.csv")
df
df.dtypes
# Customer Number 列是float64,然而应该是int64
# 2016 2017两列的数据是object,并不是float64或者int64格式
# Percent以及Jan Units 也是objects而不是数字格式
# Month,Day以及Year应该转化为datetime64[ns]格式
# Active 列应该是布尔值
# 求2016和2017数据总和,两列的数据类型为object,相加后不是想要的结果,而是得到一个更长的字符串
df['2016']+df['2017']
一、pandas、python、numpy数据类型对应关系
二、导入初始化指定
# 一次性指定所有列为object
df = pd.read_csv(r"pandas_dtypes.csv",dtype='object')
# 每个字段分别指定
df = pd.read_csv(r"pandas_dtypes.csv",dtype# ={'Customer Number': 'int64','Year':'int32'})
有些字段导入时无法指定想要的数据,比如无法将’2016‘和’2017‘这两列字符型数据直接指定为数值型数据,必须经过一定的加工处理后才可以转换(把$符号去掉)。
默认的数据类型是 int64 和 float64,文字类型是 object。
三、pandas智能推断
再导入时,假若未指定数据类型,pandas会根据数据情况选择合适的默认数据类型,避免数据发生缺失。导入后,也可以通过一些函数,智能推断。
# 自动转换合适的数据类型
df.convert_dtypes()
df.infer_objects()
四、常见方法——类型转换 astype()
# 想要真正改变原始数据框,通常需要通过赋值来进行
df['Customer Number'] = df['Customer Number'].astype('int')
像2016,2017 Percent Growth,Jan Units 这几列带有特殊符号的object是不能直接通过astype('flaot')方法进行转化的。这与python中的字符串转化为浮点数,都要求原始的字符都只能含有数字本身,不能含有其他的特殊字符。
# 将Active列转化为布尔值,五个结果全是True,不是想要的结果
df['Active'].astype('bool')
# 2016列中含有特殊字符$,无法直接转换,直接报错
df['2016'].astype('float')
astype()总结:
- 如果数据是纯净的数据,可以转化为数字
- astype基本也就是两种用作,数字转化为单纯字符串,单纯数字的字符串转化为数字,含有其他的非数字的字符串是不能通过astype进行转化的。
- 需要引入其他的方法进行转化,自定义函数方法
五、通过创建自定义的函数进行数据转化
①apply()应用自定义函数
# 通过replace函数将$去掉,然后字符串转化为浮点数,让pandas选择pandas认为合适的特定类型,float或者int,该例子中将数据转化为了float64
# 通过pandas中的apply函数将2016列中的数据全部转化
def convert_currency(var):
'''
convert the string number to a float
- 去除$
- 转化为浮点数类型
'''
new_value = var.replace('$','')
return float(new_value)
df['2016'].apply(convert_currency)
②lambda函数
# 通过lambda 函数将这个比较简单的函数一行带过
df['2016'].apply(lambda x: x.replace('$','')).astype('float64')
# 同样的,利用lambda表达式将PercentGrowth进行数据清理
df['Percent Growth'].apply(lambda x: x.replace('%','')).astype('float64')/100
③简单内置函数
# 利用np.where() function 将Active 列转化为布尔值
df['Active'] = np.where(df['Active']=='Y', True, False)
六、pandas提供的转换函数pd.to_numeric/pd.to_datatime
①pd.to_numeric()
pd.to_numeric(arg,errors = 'raise',downcast = None)
功能:将arg转换为数字类型,默认返回dtype为float64或int64。
参数说明:
- arg:标量,列表,元组,一维数组或系列。
- errors :{'ignore','raise','coerce'},默认为'raise'
“ raise”,则无效的解析将引发异常。
“coerce”,则无效解析将设置为NaN。
“ ignore”,则无效的解析将返回输入 - downcast {'integer','signed','unsigned','float'},默认值none。控制返回的dtype。
# pd.to_numeric()处理Jan Units中的数据
# 无效解析设置为NaN值,fillna()将NaN用0填充
pd.to_numeric(df['Jan Units'],errors='coerce').fillna(0)
②pd.to_datetime()
和时间序列数据有关:pd.to_datetime()官方文档
# pd.to_datatime()将年月日进行合并
pd.to_datetime(df[['Month','Day','Year']])