Python astype无法通过TestRing格式识别固定长度

Python astype无法通过TestRing格式识别固定长度,python,pandas,numpy,types,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',”表示类型对象,: “O”

考虑以下示例:

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',”表示类型
对象
,:

“O”(Python)对象

创建数据帧时,尽管指定了类型,但字符串的类型为
Object

df.dtypes

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

df = df.astype({"int":np.int8, "str": np.dtype('|S2')})
这仍然不会转换
对象
中的字符串,但是:

df.dtypes

int      int8
str    object
dtype: object
因此,当您使用
来记录时,将使用
对象来代替指定的类型

修复方法是单独创建字符串系列,并将其分配给数据帧:

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

df.dtypes

int      int8
str    object
d         |S2
dtype: object
并使用
查看记录

df.to_records(index=False)

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

表示类型
Object
在创建数据帧时,您可以为列指定
dtype
吗?您可以使用
dtype
创建一个系列,例如
pd.series(['a','b'],dtype=np.dtype('S2'))
会有类型
bytes16
。当我试图在数据帧构造函数中使用该类型时,我得到了
无法识别的数据类型
,因此当您使用该类型来创建记录时,会使用对象而不是指定的类型。
所以我不能将类型
| S2
用于熊猫的记录?@buzhidao我发布了一个解决方案,现在看看re是一种更通用的解决方案。首先生成一条记录,然后直接将数据类型分配给该记录会更方便
df.to_records(index=False)

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