常用数据类型转换的方法

核心提示在进行数据分析时,确保使用正确的数据类型是很重要的,否则我们可能会得到意想不到的结果或甚至是错误结果。对于 pandas 来说,它会在许多情况下自动推断出数据类型尽管 pandas 已经自我推断的很好了,但在我们的数据分析过程中,可能仍然需

在进行数据分析时,确保使用正确的数据类型很重要,否则我们可能会得到意想不到的结果,甚至是错误的结果。对于熊猫,很多情况下会自动推断数据类型。

尽管pandas推断得很好,但在我们的数据分析过程中,可能仍然需要显式地将数据从一种类型转换为另一种类型。本文将讨论基本的pandas数据类型,它们如何映射到python和numpy数据类型,以及如何从一种pandas类型转换到另一种。

熊猫数据类型

类型本质上是编程语言用来理解如何存储和操作数据的内部结构。比如一个程序需要理解两个数相加,比如5+10得15。或者有两个字符串,如“cat”和“hat”,可以串接得到“cathat”

关于Panda数据类型,有一点可能令人困惑,那就是Panda、python和numpy之间存在一些差异。

下表进行了相关总结。

然而,在大多数情况下,不需要担心是否应该尝试显式地强制pandas类型对应于NumPy类型。很多时候用熊猫默认的int64和float64类型就够了。

下面我们将重点介绍以下熊猫类型:

对于category和timedelta类型,我们将在下一篇文章中重点讨论它们。

还应该注意,数据类型实际上可以包含许多不同的类型。例如,A列可以包含整数、浮点数和字符串,它们统称为。因此,我们可能需要一些额外的技术来处理列中的混合数据类型,这将在下一篇文章中讨论。

让我们先来看看本文中使用的测试数据。

将numpy作为NP导入熊猫作为pddf = pd.read_csv

输出:

数据乍一看似乎不错,可以尝试做一些运算来分析数据。我们试着把2016年和2017年的销量加起来:

df['2016'] + df['2017']

0 125000.00美元162500.001美元920000.00美元1012000.002美元50000.00美元62500.003美元350000.00美元490000.004美元15000.00美元12750.00美元类型:对象

显然,结果不是我们所期望的。我们想将总数相加,但是pandas只是将两个值连接起来。其实问题也很明显。我们的数据类型是,在熊猫中object是一个字符串,所以它执行的是字符串运算,而不是数学运算。

我们可以通过下面的代码查看数据的所有数据类型信息

df.dtypes

当然,我们也可以使用df.info查看更多信息。

RangeIndex: 5个条目,0到4个数据列:#列非空计数Dtype---0客户号5非空浮点64 1客户名称5非空对象2 2016 5非空对象3 2017 5非空对象4%增长5非空对象5一月单位5非空对象6月5非空整数64 7天5非空整数64 8年5非空整数64 9活动的5非空对象Dtype:浮点64,整数64,对象内存

以上都是熊猫自动给我们分配的数据类型。有几个问题:

客户号是浮点数64,但应该是整数64

列2016和2017存储为对象,而不是数值,如float64或int64。

百分比增长和月单位也存储为对象,而不是数值。

应将月、日和年列转换为datetime64类型。

活动列应为布尔值。

也就是说,在我们分析数据之前,我们必须手动更正这些数据类型。

在pandas中,有三种转换数据类型的基本选项:

使用astype转换数据类型。

创建自定义函数来转换数据。

使用pandas函数,如to_numeric或to_datetime。

使用astype函数。

将pandas数据列转换为不同类型的最简单方法是使用astype。例如,要将客户号转换成整数,我们可以这样调用它:

df['客户号']。astype

0 100021 5522782 234773 249004 651029名称:客户编号,数据类型:int32

如果我们想改变原始数据中的信息,我们需要定义一个变量来接收返回值,因为astype函数返回一个副本。

df["客户编号"] = df[].astypedf.dtypes。

这样,我们就完成了客户号列的类型转换。

看起来很简单,我们试着对2016列做同样的事情,转换成浮点数:

同样,转换“一月单位”列。

转换异常~

在上述情况下,数据包含无法转换为数字的值。在sales列中,数据包括货币符号和每个值中的逗号;在“Jan Units”列中,最后一个值是“Closed”,它不是一个数字。

让我们再次尝试转换活动列。

df['活动']。astype

0 true 1 true 2 true 3 true 4 true name:Active,dtype: bool

乍一看似乎不错,但仔细观察,问题就大了。所有值都被解释为真,但最后一个客户的活动标志是N,实际上转换为真。

所以,我们可以得出,astype的使用是有条件的,只在下列情况下有效:

数据是干净的,可以简单地转换成一个数字。

将数值转换为字符串对象。

如果数据包含非数字字符或者不是同质的,那么astype就不是类型转换的好选择。我们需要额外的转换来使类型改变正常工作。

自定义转换功能

因为这种数据的转换有点复杂,所以我们可以构建一个自定义函数,将它应用于每个值并将其转换为适当的数据类型。

对于货币转换,我们可以使用一个简单的函数:

def convert_currency:" "将字符串数值转换为浮点数-删除$ -删除逗号-转换为浮点数类型" " " new_val = val.replace.replace返回浮点数

这段代码使用python的string函数删除“$”和“,”然后将值转换为浮点数。

也许有人会建议使用十进制类型的货币。但这不是pandas中内置的数据类型,所以我们使用float方法。

现在我们可以使用pandas的apply函数将其应用于2016列中的所有值。

df[]。应用

0 125000.01 920000.02 50000.03 350000.04 15000.0名称:2016,数据类型:float64

成功了!

当然我们也可以用lambda函数来处理。代码简洁,但可读性下降。

df[]apply . replace)。astype

接下来,为了处理活动列,自定义函数需要使用np.where,这里有几种可能的方法来解决这个特殊的问题。Np.where方法对于很多类型的问题都很有用,所以我们选择在这里使用它。

基本思想是使用np.where函数将所有“y”值转换为True,将所有其他值转换为False。

df["Active"] = np.where

该类型也转换为bool。

熊猫辅助功能

Pandas介于astype函数和更复杂的自定义函数之间,这些辅助函数对于一些数据类型转换非常有用。

到目前为止,我们还没有对日期列或一月单位列做任何事情。两者都可以通过使用内置的pandas函数进行转换,比如pd.to_numeric和pd.to_datetime。

Jan单位转换的问题是该列包含非数字值。如果我们试图使用一个类型,我们将得到一个错误。pd.to_numeric函数可以更好地处理这些值:

pd.to_numeric

0 500.01 700.02 125.03 75.04 NaNName:Jan单位,dtype: float64

有几点需要注意。首先,这个函数可以很容易地处理数据并创建一个float64列。此外,它用NaN值替换无效的“Closed”值,因为我们传递了errors = coefficient。我们可以保留这个值,或者使用fillna将它填充为0:

],错误=)。菲尔娜

最后,我们使用pd.to_datetime函数来处理日期数据。

到日期时间

类型:日期时间64[ns]

这个函数将列组合成一系列适当的datatime64dypes,这很方便。

最后,我们把上面所有的处理代码放在一起。

df_2 = pd.read_csv,:lambda x: np.where })df_2.dtypes

好了,今天的分享就到这里。

 
友情链接
鄂ICP备19019357号-22