考虑以下示例:
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'})
,并得到了相同的结果。
答案 0 :(得分:1)
这意味着键入object
,from 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')])