Pandas数据类型转换

article/2025/10/5 19:25:28

Pandas数据类型转换

一、Pandas中的数据类型:

不管是Series还是DataFrame的每一列,都有对应的数据类型。在Pandas中存在以下数据类型。

Pandas dtypePython 类型Numpy类型描述
objectstr或者mixed(混合类型)string_, unicode_, mixed类型文本或者是混合的数值或非数值类型
int64intint_, int8, int16, int32, int64, uint8, uint16, uint32, uint64整数类型
float64floatfloat_, float16, float32, float64浮点类型
boolboolbool_布尔类型
datetime64NAdatetime日期和时间类型
timedeltaNANA时间差
categoryNANA有限的列表文本值(分类)

案例数据文件:

这里我们以一个sales_data_types.csv文件为例。来讲解后面的知识点。读取代码如下:

import pandas as pd
import numpy as npdf = pd.read_csv("data/sales_data_types.csv")
df.head()

输出结果为:
sales_data_types.png

数据类型相关操作:

1. 查看DataFrame所有列的类型:

通过df.dtypes或者是df.info,即可查看df对象的类型。输入df.dtypes输出结果如下:

Customer Number    float64
Customer Name       object
2016                object
2017                object
Percent Growth      object
Jan Units           object
Month                int64
Day                  int64
Year                 int64
Active              object
dtype: object

输入df.info()输出结果如下:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 10 columns):#   Column           Non-Null Count  Dtype  
---  ------           --------------  -----  0   Customer Number  5 non-null      float641   Customer Name    5 non-null      object 2   2016             5 non-null      object 3   2017             5 non-null      object 4   Percent Growth   5 non-null      object 5   Jan Units        5 non-null      object 6   Month            5 non-null      int64  7   Day              5 non-null      int64  8   Year             5 non-null      int64  9   Active           5 non-null      object 
dtypes: float64(1), int64(3), object(6)
memory usage: 528.0+ bytes

2. 用astype转换类型:

使用astype可以非常方便的转换类型,比如将Customer Number转换为整形:

df['Customer Number'].astype('int')

以上代码并不会真正改变df['Customer Number']的类型,如果想要真正改变,则需要重新进行赋值:

df['Customer Number'] = df['Customer Number'].astype('int')

此时再查看df.dtypes,就可以看到数据类型已经发生改变了:

Customer Number     int64
Customer Name      object
2016               object
2017               object
Percent Growth     object
Jan Units          object
Month               int64
Day                 int64
Year                int64
Active             object
dtype: object

3. 自定义转换函数:

astype只能转换那些格式正确的数据。比如如果直接将df['2016']转换为浮点类型,那么会报错:

df['2016'].astype('float')

会报类似以下的错误:

ValueError       Traceback (most recent call last)
<ipython-input-45-999869d577b0> in <module>()
----> 1 df['2016'].astype('float')[lots more code here]ValueError: could not convert string to float: '$15,000.00'

这是因为在2016这一列中,有$和逗号,直接强制转换会抛出异常。这时候就需要使用自定义转换函数,把$去掉,然后再转换。代码如下:

def convert_currency(val):"""转换字符串类型为浮点类型- 移除 $符号- 移除逗号- 转换为浮点类型"""new_val = val.replace(',','').replace('$', '')return float(new_val)df['2016'].apply(convert_currency)

以上代码,也可以将convert_currency函数使用lambda表达式来替换。示例代码如下:

df['2016'].apply(lambda x: x.replace('$', '').replace(',', '')).astype('float')

4. 使用np.where更换数据类型:

比如df['Active']这列,我们可以认为只要值是Y,那么就设置为True,否则就设置为False。代码如下:

np.where(df['Active']=='Y', True, False)

5. pandas工具类函数:

pd.to_numeric函数:

pd.to_numeric函数是用于将数据转换为数值类型,他的功能更加丰富一些,我们先来看下这个函数定义的参数:

pd.to_numeric(data, errors, downcast)
  1. data:需要进行类型转换的数据。
  2. errors:在发生转换错误时的处理方式。有ignoreraisecoerce可选,默认类型为raise,其中coerce代表在发生转换异常的时候,会使用NAN来代替。
  3. downcast:期望转换的类型。有integersignedunsignedfloat可选,默认值为None。如果为None,函数会自动判断需要转换的类型。这个参数设置后,不一定会按照设置的类型来转换,比如在转换的时候出现了NAN值,我们都知道NAN值是float类型,这时候如果你指定为integer也没有任何效果。

示例代码如下:

pd.to_numeric(df['Jan Units'], errors='coerce', downcast="integer")

输出结果如下:

0    500.0
1    700.0
2    125.0
3     75.0
4      NaN
Name: Jan Units, dtype: float64

可以看到虽然我们设置了类型为integer,但最终还是float64,原因是在转换Jan Units字段的时候,最后一个数据出现了NAN

如果不想让转换失败的值为NAN,比如想用0来填充。那么可以使用fillna来实现。示例代码如下:

pd.to_numeric(df['Jan Units'], errors='coerce').fillna(0)

pd.to_datetime函数:

这个函数功能非常强大,可以将以下类型转换为datetime类型:

  1. int、floats时间戳类型。
  2. 时间格式的字符串类型。
  3. np.array一维数组、列表或者元组。
  4. Series、DataFrame或者字典类型。

下面分别来进行讲解。

  1. int、floats时间戳类型。
    必须指定unit参数为s,也就是秒。也可以指定为ms,代表毫秒,ns为纳秒(1毫秒=10^6纳秒)。
# 整形
pd.to_datetime(1642400714, unit="s")
# 浮点类型
pd.to_datetime(1642400714.3847, unit="s")
# 毫秒
pd.to_datetime(1642400714111, unit="s")
  1. 时间格式的字符串类型。时间格式可以参考:https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior
# 将字符串按照指定格式转换为datetime类型
pd.to_datetime('20220101', format='%Y%m%d')
  1. np.array一维数组、列表或者元组。
# 根据原始时间转换
pd.to_datetime([1, 2, 3], unit='D',origin=pd.Timestamp('2022-01-01'))

输出结果为:

DatetimeIndex(['2022-01-02', '2022-01-03', '2022-01-04'], dtype='datetime64[ns]', freq=None)

或者直接将列表中的字符串转换为时间类型:

pd.to_datetime(['2018-10-26 12:00 -0530', '2018-10-26 12:00 -0500'])

输出结果为:

Index([2018-10-26 12:00:00-05:30, 2018-10-26 12:00:00-05:00], dtype='object')
  1. Series或者DataFrame类型。
s = pd.Series(['3/11/2000', '3/12/2000', '3/13/2000'])
pd.to_datetime(s, infer_datetime_format=True)

其中infer_datetime_format代表自动推测时间格式。
输出结果为:

0   2000-03-11
1   2000-03-12
2   2000-03-13
dtype: datetime64[ns]

综合在一起:

我们可以把转换数据类型的工作,在一开始读取文件的时候就指定好。示例代码如下:

def convert_percent(val):"""转化%的字符串为浮点类型- 移除 %- 除以100"""new_val = val.replace('%', '')return float(new_val) / 100df_2 = pd.read_csv("data/sales_data_types.csv",dtype={'Customer Number': 'int'},converters={'2016': convert_currency,'2017': convert_currency,'Percent Growth': convert_percent,'Jan Units': lambda x: pd.to_numeric(x, errors='coerce'),'Active': lambda x: np.where(x == "Y", True, False)})

http://chatgpt.dhexx.cn/article/lMmmDN1P.shtml

相关文章

C++ 数据类型转换

C 数据类型转换 概述不同类型数据间的转换隐式类型转换强制类型转换自己声明的类型转换转换构造函数 类型转换函数案例应用 概述 在日常的开发中, 我们经常会用到数据类型转换, 所以我们要对数据类型转换有一定的了解. 不同类型数据间的转换 在 C 中, 某些标准类型的数据之间…

C语言数据类型转换详解

数据类型转换就是将数据&#xff08;变量、数值、表达式的结果等&#xff09;从一种类型转换为另一种类型。 自动类型转换 自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换&#xff0c;这种转换不需要程序员干预&#xff0c;会自动发生。 1 . 将一种类型的…

Java的数据类型转换

Java的数据类型转换分为以下的两种&#xff1a; 一、自动类型转换 首先我们要了解自动类型转换是什么&#xff0c;为什么要进行自动类型转换呢&#xff1f; 1.自动类型转换就是类型范围小的变量&#xff0c;可以直接赋值给类型范围大的变量。比如以下代码&#xff1a; 其中int类…

Python 中数据类型转换

前两篇回顾&#xff1a; 第一篇&#xff1a;环境搭建以及运行 Python 的 3 种方式 第二篇&#xff1a;变量及数据类型 今天是 Python 基础系列第三篇&#xff1a;三种数据类型转换形式&#xff08;布尔值转换、字符串转换、数值转换&#xff09;。 一、转为布尔值 一&#xf…

C语言数据类型转换

文章目录 前言一、类型自动转换二、赋值转换三、强制类型转换 前言 C语言中&#xff0c;整型、单精度型、双精度型和字符型数据可以进行混合运算。字符型数据可以得与整型通用。例如&#xff1a; 100′A′8. . 65-2456. 75′a′是一个合法的运算表达式。在进行运算时&#xf…

数据类型的转换

数据类型转换分为两种&#xff1a;自动类型转换和强制类型转换。 一、自动类型转换 ①转换前的数据类型与转换后的类型兼容。 ②转换后的数据类型的表示范围比转换前的类型大。 条件②说明不同类型的数据进行运算时&#xff0c;需先转换为同一类型&#xff0c;然后进行运算。…

数据类型转换

数据类型转换 首先&#xff0c;数据类型一共有6种&#xff0c;分别是字符串、布尔值、数值、空值、未定义和对象。 其中基本数据类型&#xff1a; 1、number数值类型&#xff1a;在JS中所有的数值都是Number类型&#xff0c;包括了整数、浮点数(小数) - 拓展部分&#xff1a…

Java全栈开发

2022年9月6日更新 更多见 个人掘金收藏 写了一个小工具 &#xff0c;可以点击查看和搜索&#xff0c;见这篇博客 JavaFx入门5 - 一个小工具的实现 网上的一些Java全栈开发技术汇总 代码更新 &#xff1a;https://git.code.tencent.com/Java66/openJava.git 目录 比较好的…

java appkey_Java全栈工程师 风袖 appkey

Java全栈工程师 全局性思维 现代项目的开发&#xff0c;需要掌握多种技术。互联网项目&#xff0c;需要用到后端开发、前端开发、界面设计、产品设计、数据库、各种移动客户端、三屏兼容、restFul API设计和OAuth等等&#xff0c;比较前卫的项目&#xff0c;还会用到Single Pag…

Java全栈进阶

https://shq5785.blog.csdn.net/

java全栈前景_Java全栈开发哪个发展前景好

原标题&#xff1a;Java全栈开发哪个发展前景好 全栈和java哪个能更好迎合市场需求&#xff0c;有同学咨询学习哪个在以后前景和工作薪水上能更吃香&#xff0c;首先我们先来了解下Java开发和全栈开发的区别。 全栈开发工程师是指掌握多种技能&#xff0c;能够独立开发应用程序…

Java全栈工程师学习路线(思维导图)送你进大厂

当今软件行业中&#xff0c;Java是最流行的编程语言之一。许多企业都需要Java开发人员来构建和维护应用程序。因此&#xff0c;作为一名Java开发人员&#xff0c;学习Java编程语言和相关技术是至关重要的。下面是一些Java学习路线的建议&#xff1a; 目录 Java 基础Java高级We…

零基础Java全栈教程--全文目录

文章目录 1. 教程结构2. 教程目录2.1 HTML篇2.2 CSS篇2.3 JS篇2.4 Java 语言基础篇2.5 Java Web基础篇2.6 JSJava项目实战篇2.7 jQuery篇2.8 BootStrap篇2.9 Java SSM篇2.10 BootStrapSSM项目实战篇2.11 ESWebpack篇2.12 Vue篇2.13 Element篇2.14 SpringBoot篇2.15 VueSpringBo…

Java全栈学习路线

在学习Java苦于没有自己的完整学习步骤&#xff0c;下面是一个大概的学习路线&#xff1a; 一、Java基础 二、JavaWeb 三、SSM框架 四、Linux运维 五、微服务和分布式 六、大数据开发 七、持续学习 总结&#xff1a; 目前自己正处于一个找工作的阶段&#xff0c;也希望这些学…

java全栈开发主要工作内容,java全栈工程师

KEYRESPONSIBILITIES: •Code,testandreleasechangesasperstandardCitiguidelines •Provideanalysisandwritefunctional&technicalspecifications •Communicateandworkcloselywithpeerdevelopersofglobalteam •HandleBAUactivities,includingidentifyingandresolvingbug…

java全栈知识点[面试篇](一)

jjava全栈知识点[面试篇]&#xff08;一&#xff09; 阻塞与等待的状态转变⭐Synchronized本质上是通过什么保证线程安全的?volatile、synchronized和Lock如何保证可见性⭐Synchronized使得同时只有一个线程可以执行&#xff0c;性能比较差&#xff0c;有什么提升的方法?⭐sy…

java面试必问,java全栈面试题

一、前言 有句话&#xff1a;正因为你优秀&#xff0c;所以难以卓越&#xff01; 刚开始听这句话还在上学&#xff0c;既不卓越、也不优秀&#xff0c;甚至可能还有点笨&#xff01;但突然从某次爬到班级的前几名后&#xff0c;开始喜欢上了这种感觉&#xff0c;原来前面的风…

从搬砖工到架构师,Java全栈学习路线总结

&#x1f307;文章目录 前言一、前置知识二、 Web前端基础示例&#xff1a;1.文本域2.密码字段 三、后端基础一. Java基础二. 数据库技术三. Web开发技术四. 框架技术五. 服务器部署 四、其他技术五、全栈开发六、综合实践七、学习教程一、前端开发二、后端开发三、数据库开发四…

java全栈(java全栈开发工程师)

如何记录Java栈区的指针&#xff1f; optop,frame和vars用于记录指向Java栈区的指针 Java全栈工程师在未来的发展如何&#xff1f; 全栈工程师是指网站开发所有东西都要负责(即前端和后端都要负责)&#xff0c;前端是指网站的网页设计&#xff0c;后端是指网站的数据动态变化&a…

1. JAVA全栈知识体系--- Java基础

1. JAVA全栈知识体系— Java基础 文章目录 1. JAVA全栈知识体系--- Java基础1.1 语法基础面向对象特性&#xff1f;a a b 与 a b 的区别3*0.1 0.3 将会返回什么? true 还是 false?能在 Switch 中使用 String 吗?对equals()和hashCode()的理解&#xff1f;final、finaliz…