本文介绍: 利用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)

参数说明

举例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.自定义函数行数据类型转换

方法通过构建一个函数用于数据列一个数据,并将其转换为适合的数据类型。比如上述“将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)

参数说明:

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

https://zhuanlan.zhihu.com/p/35287822#:~:text=1%20%E4%BD%BF%E7%94%A8astype%20%28%29%E5%87%BD%E6%95%B0%E8%BF%9B%E8%A1%8C%E5%BC%BA%E5%88%B6%E7%B1%BB%E5%9E%8B%E8%BD%AC%E6%8D%A2%202,%E8%87%AA%E5%AE%9A%E4%B9%89%E5%87%BD%E6%95%B0%E8%BF%9B%E8%A1%8C%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E8%BD%AC%E6%8D%A2%203%20%E4%BD%BF%E7%94%A8Pandas%E6%8F%90%E4%BE%9B%E7%9A%84%E5%87%BD%E6%95%B0%E5%A6%82to_numeric%20%28%29%E3%80%81to_datetime%20%28%29

原文地址:https://blog.csdn.net/sodaloveer/article/details/132477895

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_23678.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注