python数据分析基础—Pandas数据类型转换
利用Pandas进行数据清洗,探索时,常常会涉及的数据类型的转换,发现某些特征列不是Pandas所能处理的类型,因此如何将Python基本数据类型转化为Pandas所能处理的数据类型,本文主要介绍三种方法,astype()、自定义函数及to_numeric()转化为Pandas所能处理的数据类型。
文章目录
一、Pandas、Numpy、Python各自支持的数据类型
利用Pandas进行数据清洗,探索时,常常会涉及的数据类型的转换,发现某些特征列不是Pandas所能处理的类型,因此如何将Python基本数据类型转化为Pandas所能处理的数据类型,是后续数据分析的前期工作。
Python dtype | Pandas type | Numpy type |
---|---|---|
str | object | string_,unicode_ |
int | int64 | int_,int8,int32,int64,unit8,unit16,unit32,unit64 |
float | float64 | float_,float16,float32,float64 |
bool | bool | bool_ |
NA | datetime64 | NA |
NA | timesdate[ns] | NA |
NA | category | NA |
从上述表格中,可以看出Pandas支持的数据类型最为丰富,在某种情形下Numpy的数据类型可以与Pandas的数据类型相互转化,毕竟Pandas在Numpy的基础上开发的。
二、Pandas中转换数据类型
导入数据
import os
import pandas as pd
import numpy as np
#读取文件
def read_file(filepath):
os.chdir(os.path.dirname(filepath))
return pd.read_csv(os.path.basename(filepath),encoding='utf-8')
file_pos="F:\\python_test\\data_1.csv"
data_pos=read_file(file_pos)
data_pos
查看数据情况
data_pos.dtypes
运行结果:
需要更改数据类型的部分:
1、客户编号serv_id的数据类型应该是object类型而不是int64类型。
2、2021金额与2022金额的数据类型应该是int64类型或者float64类型,而不是object类型。
3、所属组的数据类型应该是float64类型,而不是object类型。
1.通过astype()方法强制转换数据的类型
函数语法:
astype(dypte, copy=True, errors = ‘raise’, **kwargs)
参数说明:
- dtype:表示数据类型
- copy:是否建立副本,默认为True。
- errors:错误采取的处理方式,可以取值为raise或者为ignore,默认为raise。其中raise表示允许引发异常,ingnore表示抑制异常。
举例1
要求:将客户编号serv_id数据列的数据类型从int64类型转换成object类型。
data_pos['serv_id'].astype('object')
举例2
要求:将2021金额与2022金额的数据类型从object类型转换成float64
data_pos['2021金额'].astype('float64')
举例3
要求:将所属组的数据类型从object类型转换成int64类型。
data_pos['所属组'].astype('int64')
举例4
要求:将状态的数据类型从object类型转换成bool类型。
data_pos['状态'].astype('bool')
通过上面例子2和例子3发现,当数据列中有非数字类型的字符(例子中¥,Nan等),astype()函数将失效,无法将其转换成数字类型(int64或者float64),若强制转换会出现ValueError的异常(当参数errors取值ignore时可以抑制异常,但抑制异常后输出结果仍是未转换类型之前的对象——也就是并未进行数据类型转换的操作,只是不会报错罢了)。
观察例子4,你会发现,即使运行成功了,那就是所有的值都被替换成True,但是该列中包含好几个N标志,所以astype()函数在该列也是失效的。
总结:
- 数据列中每一个单位都是简单的数字(2,2.12等),使用astype()进行转换是有效的。
- 数据列中每一个单位都是数值类型,使用astype()可以向字符串object类型进行转换。
- 如果数据中存在缺失值,特殊字符(非数字字符),astype()函数可能失效。
2.自定义函数进行数据类型转换
方法一:通过构建一个函数应用于数据列一个数据,并将其转换为适合的数据类型。比如上述“将2021金额与2022金额的数据类型从object类型转换成float64”可以用自定义函数方法。
举例1
要求:将2021金额与2022金额的数据类型从object类型转换成float64。
def convert_currency(value):
'''
转换字符串数字为float类型
移除不是数字字符 ¥,
转换为float类型
'''
new_value=value.replace({',':'','¥':''},regex=True)
print(new_value)
return new_value.astype('float')
#2021金额、2022金额列完整的转换代码
data_pos['2021金额']=convert_currency(data_pos['2021金额'])
data_pos['2022金额']=convert_currency(data_pos['2022金额'])
举例2
要求:将增长率的数据类型从object类型转换成float64。
def convert_percent(value):
"""
转换字符串百分数为float类型小数
- 移除 %
- 除以100转换为小数
"""
new_value = value.replace('%', '',regex=True)
return new_value.astype("float64") / 100
data_pos['增长率']=convert_percent(data_pos['增长率'])
方法二:使用lambda表达式
data_pos["2021金额"].apply(lambda x:x.replace(',','').replace('¥','')).astype("float64")
data_pos["2022金额"].apply(lambda x:x.replace(',','').replace('¥','')).astype("float64")
data_pos["增长率"].apply(lambda x:x.replace('%','')).astype("float64")/100
3.使用Pandas提供的函数to_numeric()
函数语法:
pandas.to_numeric(arg, errors=‘raise’, downcast=None)
参数说明:
- arg:表示要转换的数据,可以是list、tuple、Series。
- errors:错误采用的处理方式可以取值除raise、ignore外,还可以取值coerce,默认为raise。其中raise表示允许引发异常,ignore表示抑制异常。
- downcast:{‘integer’, ‘signed’, ‘unsigned’, ‘float’},默认为无。
pandas中的to_numeric()函数相对于astype()函数优势,在于可以解决:astype()包含一个非数值字符,转换就会出现错误的问题。
to_numeric()函数之所以可以解决这个问题,源于其errors参数可以取值coerce——当出现非数字字符时,会将其替换为缺失值之后进行数据类型转换。
举例1
要求:将所属组的数据类型从object类型转换成float64类型,使用to_numeric()将非数字字符先转成空值NaN缺失值,然后填充为0。
import pandas as pd
pd.to_numeric(data_pos['所属组'],errors='coerce').fillna(0) #将字符串和bool类型转换为数字,其他均转换为NaN,本例中是将Nan字符串转换成NaN缺失值,然后填充为0。
举例2
要求:其他参数的使用例子
pd.to_numeric(data_pos['所属组'],errors='raise') #遇到含有非数字字符串类型报错。
pd.to_numeric(data_pos['所属组'],errors='ignore') #只对数字字符串转换,其他类型一律不转换。
pd.to_numeric(data_pos['所属组'],errors='ignore',downcast='signed') #转换为整型。
三、实际业务应用
引入实际数据进行分析
import os
import pandas as pd
import numpy as np
#读取文件
def read_file(filepath):
os.chdir(os.path.dirname(filepath))
return pd.read_csv(os.path.basename(filepath),encoding='utf-8')
file_pos="C:\\Users\\Desktop\\train_data_original.csv"
data_pos=read_file(file_pos)
查看数据类型
data_pos.dtypes
举例1:
要求:号码billing_nbr根据要求应该是object类型,而不是int64类型。以下两种方法都可以。
data_pos['billing_nbr'].astype('object')
data_pos['billing_nbr'].apply(str)
参考文章:
https://blog.csdn.net/Jormungand_V/article/details/109813368
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)