从numpy数组创建pandas DataFrame会导致奇怪的错误

4
简而言之,当我试图从功能性的numpy数组创建DataFrame时,它们会产生字节序错误。以下是pastebin链接,更多细节请参考下文:http://pastebin.com/Sdg9EM61 在我的领域,我们将数据存储在二进制格式的.FIT文件中(这对后面可能会有用)。
我不太清楚如何解决以下几行代码和错误信息。
d = fits.getdata('file.fit')
d2 = np.array(d)

然后你可以使用它来做一些酷炫的技巧,比如:
d2[d2['key1'] > 10.]
d2[['key1', 'key2']]

当我将它转换为pandas DataFrame时

d3 = pandas.DataFrame(d2)

当涉及到IT技术时,有些事情开始变得奇怪。例如,列名已经发生了改变:

d3.columns

返回值

Index([u'key1', u'key2'], dtype='object')

与以前不同,现在每个列名前都有一个新的“u”。

d2.dtype

返回

dtype([('key1', '>i4'), ('key2', 'S19')])

虽然在数据框架中,通过d3.dtypes查看数据类型时一切看起来都很正常,但是... 无论如何,数据框架中包含了所有的数据,并保留了数据类型,我可以打印出表征数据等。但是一旦我尝试像这样做些什么:
d3[d3['key1'] > 10.]

我遇到了一个关于字节序的巨大错误:

ValueError: Big-endian buffer not supported on little-endian compiler

有什么见解以及如何解决这个问题?

1
似乎与此相关:https://github.com/astropy/astropy/issues/1156 - cel
1个回答

12

好的,问题实际上出在FITS文件上。事实证明,所有的FITS文件都是大端(big endian)格式,而pandas和scipy等程序通常假设小端(little endian)格式(我不知道什么是这个“端”),这似乎会导致一些奇怪的问题(在看pandas之前我从未见过)。

我找到的解决方法是:

d = fits.getdata('data.fit')
df=pd.DataFrame(np.array(d).byteswap().newbyteorder())

解决方案在这里:

https://github.com/astropy/astropy/issues/1156

字节序是关于位序的。即数据是以相反的顺序还是正常顺序写入的。 - firelynx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接