3

我创建了一个 pandas 数据框,通过以下方式从 scipy.io 读取它(file.sav 是在另一台机器上创建的 IDL 结构。scipy.io 创建了一个标准的 python 字典):

from scipy import io
import pandas as p
import numpy as np
tmp=io.readsav('file.sav', python_dict = True)
df=pd.DataFrame(tmp,index=tmp['shots'].astype('int32'))

数据框包含一组值(来自file.sav)和作为索引的一系列整数,形式为 19999,20000,30000 等。现在我想取这些索引的一个子集,说

df.loc[[19999,20000]]

由于某些原因,我收到表格错误

raise ValueError('Cannot index with multidimensional key')

加上其他和最后

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

但是我已经检查过我正在使用的机器和创建 file.sav 的机器都是小端的。所以我不认为这是问题所在。

4

2 回答 2

5

您的输入文件是大端。看到这里转换它: http: //pandas.pydata.org/pandas-docs/dev/gotchas.html#byte-ordering-issues

比较之前和之后

In [7]: df.dtypes
Out[7]: 
a        >f4
b        >f4
c        >f4
shots    >f4
dtype: object

In [9]: df.apply(lambda x: x.values.byteswap().newbyteorder())
Out[9]: 
<class 'pandas.core.frame.DataFrame'>
Int64Index: 100 entries, 20000 to 20099
Data columns (total 4 columns):
a        100  non-null values
b        100  non-null values
c        100  non-null values
shots    100  non-null values
dtypes: float32(4)

In [10]: df.apply(lambda x: x.values.byteswap().newbyteorder()).dtypes
Out[10]: 
a        float32
b        float32
c        float32
shots    float32
dtype: object

执行此操作后还要设置索引(例如,不要在构造函数中执行此操作)

df.set_index('shots',inplace=True)
于 2013-09-03T20:06:09.507 回答
1

根据您的评论,我将通过以下方式解决问题:

values_i_want = [19999, 20000, 20005, 20007]
subset = df.select(lambda x: x[0] in values_i_want)

如果您的数据框非常大(听起来确实如此),则该select方法可能会很慢。在这种情况下,另一种方法是循环values_i_want获取横截面(df.xs(val, level=0)并将它们附加到输出数据帧。换句话说(未经测试):

for n, val in enumerate(values_i_want):
    if n == 0:
         subset = df.xs(val, level=0)
    else:
         subset = subset.append(df.xs(val, level=0))

不确定这是否会更快。但如果select方法太慢,值得尝试。

于 2013-09-03T20:11:49.120 回答