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

标签 python pandas

总而言之,当我尝试从功能性 numpy 数组创建 DataFrame 时,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)

事情开始变得奇怪了。列名已更改,例如:

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.]

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

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

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

最佳答案

好的,FITS 文件实际上是问题所在。事实证明 FITS 都是大端,而 pandas 和 scipy 之类的东西倾向于采用小端(我不知道这个端业务是什么,只是总结了一个线程)这显然会导致一些奇怪的问题(我从来没有见过直到看在 Pandas )。

我找到的解决方案是:

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

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

关于python - 从 numpy 数组创建 pandas DataFrame 会导致奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30283836/

相关文章:

python - 在 Jupyter 笔记本中重新加载 Python 模块(不自动重新加载)

python - 在 .csv 文件中读取时,我似乎无法指定列数据类型

python - 用于测试生成器是否为 "running"和/或已经耗尽的标志

python - python-attrs 中带有额外参数的自定义验证器

Python - 从网页 PDF 中提取文本

python - 使用 Pandas 读取 CSV 时,应该如何处理 `*_id` 列?

python - 将大型 (10gb) 时间序列 CSV 文件处理为每日文件

python - 属性错误: 'tuple' object has no attribute for the code below

python - pandas groupby 列值(按零值分割)

python - 如何访问 Python Click 应用程序的主要上下文对象