从Pandas DataFram中提取多个非连续索引值

2024-05-08 15:34:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个pandas数据帧,从scipy.io公司以下面的方式(文件.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'))

数据帧包含一组值(从文件.sav)以1999920000300003等形式的一系列整数作为索引。 现在我想从这些指数中提取一个子集,他说

^{pr2}$

由于某些原因我得到了表格上的错误

raise ValueError('Cannot index with multidimensional key')

再加上另一个和结尾

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

但我已经检查了我正在工作的机器和创建文件.sav都是小恩迪安。所以我不认为这是问题所在。在


Tags: 文件数据ioimportpandasindexas计算机
2条回答

你的输入文件是big-endian。请参阅此处转换它: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

也可以在完成此操作后设置索引(例如,不要在构造函数中这样做)

^{pr2}$

从你的意见来看,我将以以下方式处理这个问题:

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),并将它们附加到输出数据帧中。换句话说(未经测试):

^{pr2}$

不知道是否会更快。但是如果select方法太慢,那么值得一试。在

相关问题 更多 >

    热门问题