在进行数据分析时,确保使用正确的数据类型很重要,否则我们可能会得到意想不到的结果,甚至是错误的结果。对于熊猫,很多情况下会自动推断数据类型。
尽管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
好了,今天的分享就到这里。


