DataFrame中的string,但是dtype是对象

为什么大pandas告诉我,我有对象,尽pipe选定列中的每个项目都是一个string – 即使在显式转换之后。

这是我的DataFrame:

<class 'pandas.core.frame.DataFrame'> Int64Index: 56992 entries, 0 to 56991 Data columns (total 7 columns): id 56992 non-null values attr1 56992 non-null values attr2 56992 non-null values attr3 56992 non-null values attr4 56992 non-null values attr5 56992 non-null values attr6 56992 non-null values dtypes: int64(2), object(5) 

其中五个是dtype object 。 我明确地将这些对象转换为string:

 for c in df.columns: if df[c].dtype == object: print "convert ", df[c].name, " to string" df[c] = df[c].astype(str) 

然后, df["attr2"]仍然有dtype object ,虽然type(df["attr2"].ix[0]显示str ,这是正确的。

pandas区分int64float64object 。 当没有dtype str时,它背后的逻辑是什么? 为什么被object覆盖的一个str

dtype对象来自NumPy,它描述了ndarray中元素的types。 ndarray中的每个元素必须具有相同的字节大小。 对于int64和float64,它们是8个字节。 但是对于string,string的长度是不固定的。 因此,不要直接在ndarray中保存string的字节,Pandas使用对象ndarray来保存指向对象的指针,因此这种types的dtype是对象。

这里是一个例子:

  • int64数组包含4个int64值。
  • 对象数组包含4个指向3个string对象的指针。

在这里输入图像描述