我有一个Pandas数据框,我希望将其转换为NumPy记录数组或结构化数组。我正在使用Python 3.6 / Pandas 0.19.2 / NumPy 1.11.3。
df = pd.DataFrame(data=[[True, 1, 2],[False, 10, 20]], columns=['a','b','c'])
print(df.dtypes)
a bool
b int64
c int64
dtype: object
我的尝试如下:
# record array
res1 = df.to_records(index=False)
# structured array
s = df.dtypes
res2 = np.array([tuple(x) for x in df.values], dtype=list(zip(s.index, s)))
但是,在这些结果的dtype
属性中,布尔类型似乎并不明显:
print(res1.dtype)
(numpy.record, [('a', '?'), ('b', '<i8'), ('c', '<i8')])
print(res2.dtype)
[('a', '?'), ('b', '<i8'), ('c', '<i8')]
这是为什么?更笼统地说,这是唯一的例外,还是我们应该每次都必须手动检查以确保dtype转换已按预期进行了处理?
修改:另一方面,看来 转换正确:
print(res1.a.dtype) # bool
print(res2['a'].dtype) # bool
这只是显示问题吗?
答案 0 :(得分:0)
奇怪的是,NumPy选择?
来表示布尔值。来自Data type objects (dtype):
'?' boolean
'b' (signed) byte
'B' unsigned byte
'i' (signed) integer
'u' unsigned integer
'f' floating-point
'c' complex-floating point
'm' timedelta
'M' datetime
'O' (Python) objects
'S', 'a' zero-terminated bytes (not recommended)
'U' Unicode string
'V' raw data (void)
令人困惑的是,从C扩展访问的NumPy Array Interface使用了不同的映射:
t Bit field (following integer gives the number of bits in the bit field).
b Boolean (integer type where all values are only True or False)
i Integer
u Unsigned integer
f Floating point
c Complex floating point
m Timedelta
M Datetime
O Object (i.e. the memory contains a pointer to PyObject)
S String (fixed-length sequence of char)
U Unicode (fixed-length sequence of Py_UNICODE)
V Other (void * – each item is a fixed-size chunk of memory)
在文档中找到@bobrobbob的信用。