熊猫astype无法识别固定长度的字节串格式

时间:2018-08-10 15:34:18

标签: python pandas numpy types

考虑以下示例:

df = pd.DataFrame([[1, "a"], [2, "b"]], columns=["int", "str"])
df.astype({"int":np.int8, "str": np.dtype('|S2')})
arr = df.to_records(index=False)
print(arr.dtype.descr)

我希望看到的是:

[(u'int', '<i8'), (u'str', '|S2')]

相反,我得到了:

[(u'int', '<i8'), (u'str', '|O')]

为什么'|O'是什么意思?

我也尝试了df.astype({"int":np.int8, "str": '|S2'}),并得到了相同的结果。

1 个答案:

答案 0 :(得分:1)

这意味着键入objectfrom the docs

  

'O'(Python)对象

创建DataFrame时,尽管您指定了类型,但字符串的类型为Object

df.dtypes

int     int64
str    object
dtype: object

astype 不是是就地操作,因此您的命令目前不执行任何操作,您需要重新分配:

df = df.astype({"int":np.int8, "str": np.dtype('|S2')})

但这仍然不能转换来自object的字符串:

df.dtypes

int      int8
str    object
dtype: object

因此,当您使用to_records时,将使用object代替您指定的类型。

一种解决方法是分别创建您的字符串系列,并将其分配给您的DataFrame:

s = pd.Series(['a', 'b'], dtype=np.dtype('|S2'))
df['d'] = s

df.dtypes

int      int8
str    object
d         |S2
dtype: object

并使用to_records

df.to_records(index=False)

rec.array([(1, b'a', b'a'), (2, b'b', b'b')],
          dtype=[('int', 'i1'), ('str', 'O'), ('d', 'S2')])