为什么在从对象或str转换为类别时dtype是不同的?

时间:2018-02-07 20:39:46

标签: python pandas categories

为什么在将列转换为pandas中的类别时会收到两种不同的行为?

举个例子,假设我使用

创建一个数据框
>>> 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

dtype现在是对象。

>>> df['nombre'] = df['nombre'].astype('category')
>>> print(df['nombre'].cat.categories.dtype.name)
int64

转换为类别后,内部dtype为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

内部表示是一个对象。这是有道理的,因为我们转换为了一个'。

>>> df['nombre'] = df['nombre'].astype('category')
>>> print(df['nombre'].cat.categories.dtype.name)
object

转换为类别后,内部dtype现在是object,这与我们之前收到的int64不同?

所以我的问题如下,为什么在从对象dtype转换为类别时会收到两种不同的行为?

1 个答案:

答案 0 :(得分:4)

.astype(object)不会将数字转换为字符串。它将数字转换为相应的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

但是当你使用astype(str)时,它会将所有内容转换为字符串。在这样做的同时,它也将系列转换为对象系列。这是因为它是唯一可以保存字符串的dtype。

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

type(df['nombre'][0])
Out[69]: str

所以这只与你的输入数据有关。在第一个传递整数时,你得到一个整数数组。在传递字符串的第二个中,您将获得一个对象数组。

还有术语"内部dtype"可能不合适。这是包含类别的系列的dtype;不是他们的代码。在这两个示例中,df['nombre'].cat.codes是内部表示,其dtype是int8