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

时间:2015-05-17 05:57:02

标签: python pandas

当我尝试从功能性numpy数组创建它们时,DataFrames正在吐出endianess错误。这是一个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)
事情开始变得怪异。列名已更改,例如:

d3.columns

返回

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

将这个新的u放在每个列名前面而不是

d2.dtype

返回

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

虽然当你执行d3.dtypes而不是d3.columns时,数据类型中的数据类型看起来不错......

无论如何,DataFrame拥有所有数据并保留数据类型,我可以打印出特征数据等,但是一旦我尝试做这样的事情:

d3[d3['key1'] > 10.]

我收到关于endianess的怪物错误:

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

有关这意味着什么以及如何解决的任何见解?

1 个答案:

答案 0 :(得分:4)

好的,FITS文件实际上是问题所在。事实证明FITS都是大端,而pandas和scipy和东西倾向于假设小端(我不知道这个端项业务是什么,只是总结了一个线程)这显然会引起一些奇怪的问题(我直到看到我才看到)在熊猫)。

我找到的解决方案是:

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

解决方案位于此处: https://github.com/astropy/astropy/issues/1156