我已经创建了一个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的机器都是小端。所以我认为这不是问题所在。
答案 0 :(得分: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)
答案 1 :(得分: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
方法太慢,那就值得尝试。