Python 从对象或str转换为类别时,为什么数据类型不同?

Python 从对象或str转换为类别时,为什么数据类型不同?,python,pandas,categories,Python,Pandas,Categories,为什么在将列转换为熊猫中的类别时,我会收到两种不同的行为 作为一个例子,假设我创建了一个带有 >>> import pandas as pd >>> import numpy as np >>> pd.__version__ u'0.22.0' >>> np.__version__ '1.14.0' >>> df = pd.DataFrame(columns=['nombre'], data=[1,2,3,

为什么在将列转换为熊猫中的类别时,我会收到两种不同的行为

作为一个例子,假设我创建了一个带有

>>> import pandas as pd
>>> import numpy as np
>>> pd.__version__
u'0.22.0'
>>> np.__version__
'1.14.0'
>>> df = pd.DataFrame(columns=['nombre'], data=[1,2,3,4])
现在,我将我的列转换为对象:

>>> df['nombre'] = df['nombre'].astype('object')
>>> print(df['nombre'].dtype)
object
数据类型现在是对象

>>> df['nombre'] = df['nombre'].astype('category')
>>> print(df['nombre'].cat.categories.dtype.name)
int64
转换为类别后,内部数据类型为int64

让我们从一个新的数据帧开始

>>> del df
>>> df = pd.DataFrame(columns=['nombre'], data=[1,2,3,4])
这次,我们将内部列转换为“str”

>>> df['nombre'] = df['nombre'].astype('str')
>>> print(df['nombre'].dtype)
object
内部表示是一个对象。这是有道理的,因为我们转换为“str”

>>> df['nombre'] = df['nombre'].astype('category')
>>> print(df['nombre'].cat.categories.dtype.name)
object
转换为类别后,内部数据类型现在是object,这与我们之前收到的int64不同

因此,我的问题是,为什么从对象数据类型转换为类别时会收到两种不同的行为?

。astypeobject不会将数字转换为字符串。它将数字转换为示例中相应的Python对象,将numpy.int64转换为Python int

比如说,

df = pd.DataFrame(columns=['nombre'], data=[1,2,3,4])

type(df['nombre'][0])
Out[64]: numpy.int64


df['nombre'] = df['nombre'].astype('object')

type(df['nombre'][0])
Out[66]: int
但当您使用astypestr时,它会将所有内容转换为字符串。执行此操作时,它还将序列转换为对象序列。这是因为这是唯一可以保存字符串的数据类型

df['nombre'] = df['nombre'].astype('str')

type(df['nombre'][0])
Out[69]: str
所以这只是和你的输入数据有关。在第一个传递int的数组中,得到一个整数数组。在第二次传递字符串时,将得到一个对象数组

此外,术语“内部数据类型”在这里可能不合适。这是包含类别的系列的数据类型;不是他们的代码。在这两个示例中,df['nombre'].cat.codes是内部表示,其数据类型为int8