Python 为什么我的Paneland工厂抛出一个键错误?

Python 为什么我的Paneland工厂抛出一个键错误?,python,pandas,Python,Pandas,我正在Ubuntu13.04上使用熊猫版0.12.0。我正在尝试创建一个5D面板对象,以包含一些按条件分割的EEG数据 我选择如何构建我的数据: 首先让我演示一下pandas.core.panelnd.create\u和panel\u工厂的用法 Subject = panelnd.create_nd_panel_factory( klass_name='Subject', axis_orders=['setsize', 'location', 'vfield', 'channel

我正在Ubuntu
13.04
上使用熊猫版
0.12.0
。我正在尝试创建一个5D面板对象,以包含一些按条件分割的EEG数据

我选择如何构建我的数据: 首先让我演示一下pandas.core.panelnd.create\u和panel\u工厂的用法

Subject = panelnd.create_nd_panel_factory(
    klass_name='Subject',
    axis_orders=['setsize', 'location', 'vfield', 'channels', 'samples'],
    axis_slices={'labels': 'location',
            'items': 'vfield',
            'major_axis': 'major_axis',
            'minor_axis': 'minor_axis'},
    slicer=pd.Panel4D,
    axis_aliases={'ss': 'setsize',
            'loc': 'location',
            'vf': 'vfield',
            'major': 'major_axis',
            'minor': 'minor_axis'}
    # stat_axis=2  # dafuq is this?
    )
基本上,该组织如下:

  • setsize
    :实验条件,可以是
    1
    2
  • 位置
    :实验条件可以是
    “相同”
    “差异”
  • vfield
    :实验条件可以是
    “lvf”
    或“
    rvf
最后两个轴对应于
数据帧的
长轴
短轴
。为清晰起见,已将其重命名为:

  • 通道
    :列,EEG通道(其中129个)
  • 样本
    :行,单个样本<代码>样本
可以作为时间轴 我想做的是: 每个实验条件(
subject
x
setsize
x
location
x
vfield
)都存储在它自己的制表符分隔文件中,我正在用pandas.read_table读取,获得一个
DataFrame
对象。我想为每个受试者创建一个5维面板(即
受试者
),其中将包含该受试者的所有实验条件(即
数据帧

首先,我正在为每个主题构建一个嵌套字典主题:

# ... do some boring stuff to get the text files, etc...
for _, factors in df.iterrows():
    # `factors` is a 4-tuple containing
    #  (subject number, setsize, location, vfield, 
    #  and path to the tab-delimited file).
    sn, ss, loc, vf, path = factors
    eeg = pd.read_table(path, sep='\t', names=range(1, 129) + ['ref'], header=None)

    # build nested dict
    subjects.setdefault(sn, {}).setdefault(ss, {}).setdefault(loc, {})[vf] = eeg

# and now attempt to build `Subject`
for sn, d in subjects.iteritems():
    subjects[sn] = Subject(d)
全堆栈跟踪
---------------------------------------------------------------------------
KeyError回溯(最近一次呼叫最后一次)
在()
---->1导入_数据()
/导入_data()中的home/louist/Dropbox/Research/VSTM/scripts/vstmlib.py
64
65进口ipdb;ipdb.set_trace()
--->66对于受试者中的sn,d。iteritems():
67名受试者[sn]=受试者(d)
68
/usr/local/lib/python2.7/dist-packages/pandas/core/panelnd.pyc在__init_____(self,*args,**kwargs)中
65如果“数据类型”不在kwargs中:
66 kwargs['dtype']=无
--->67自初始化数据(*args,**kwargs)
68 klass.uuuu init_uuuuuu=uuuuuuuu init__
69
/usr/local/lib/python2.7/dist-packages/pandas/core/panel.pyc in_init_data(self、data、copy、dtype、**kwargs)
250 mgr=数据
251 elif isinstance(数据、指令):
-->252 mgr=self.\u init\u dict(数据,传递轴,数据类型=dtype)
253副本=错误
254数据类型=无
/usr/local/lib/python2.7/dist-packages/pandas/core/panel.pyc in_init_dict(self、data、axes、dtype)
293 raxes=[self.\u extract\u axis(self,data,axis=i)
294如果a不是i的其他a,则a在枚举(轴)]
-->295 raxes\u sm=self.\u为切片提取轴(self,raxes)
296
297#浅拷贝
/usr/local/lib/python2.7/dist-packages/pandas/core/panel.pyc in_extract_axes_for_slice(self,axes)
1477“返回这些轴的切片字典”
1478返回dict([(自身轴)切片映射[i],a)表示i,a
->1479英寸拉链(自身轴顺序[自身轴长度-长度(轴):],轴)])
1480
1481@staticmethod
KeyError:“位置”
我知道
panelnd
是一个实验性功能,但我相当肯定我做错了什么。谁能给我指一下正确的方向吗?如果它是一个bug,有什么可以做的吗


像往常一样,提前非常感谢您

工作示例。您需要通过切片指定轴到内部轴名称的映射。这会干扰内部结构,但熊猫的固定名称仍然存在(并且通过Panel/Panel4D进行了一些硬编码),因此您需要提供映射

我会先创建一个4D面板,然后像下面一样创建您的主题

如果您发现更多bug,请在github/此处发布。这不是一个经常使用的功能

输出

<class 'pandas.core.panelnd.Subject'>
Dimensions: 3 (setsize) x 1 (location) x 1 (vfield) x 10 (channels) x 2 (samples)
Setsize axis: level0_0 to level0_2
Location axis: level1_0 to level1_0
Vfield axis: level2_0 to level2_0
Channels axis: level3_0 to level3_9
Samples axis: level4_1 to level4_2

非常感谢你的例子。我马上就开始。同时,您是否知道
stat\u axis
参数在
panelnd.create\u nd\u panel\u factory
中的作用?我找不到任何文档,我想我会广泛地使用这个功能。好的,你的例子似乎运行得很好,所以我很高兴接受你的答案!不过,我还有几个问题。1) 我没有构建
Panel4D
就尝试了它,它似乎起了作用(除了前面提到的警告问题#2)。为什么建议先创建
面板4d
?2) 我的
通道
样本
轴似乎颠倒了。给出了什么?你并不真的需要它,当你不提供轴时,它只是与默认值有关。只需指定实际操作的时间。e、 g.
s.mean(axis='location')
(仅在某些情况下使用)数据帧在放入更高级别时具有反转轴,只需在分配它们时提供
df.T
(类似于作为构造函数提供dict时获得的结果)完美!我真是太感谢你了!关于您的最后一条评论,最后一个问题是:
DataFrame
在这种情况下为什么要反转它的轴?我认为这是故意的,但我不太清楚为什么这是一个可取的特性。
<class 'pandas.core.panelnd.Subject'>
Dimensions: 3 (setsize) x 1 (location) x 1 (vfield) x 10 (channels) x 2 (samples)
Setsize axis: level0_0 to level0_2
Location axis: level1_0 to level1_0
Vfield axis: level2_0 to level2_0
Channels axis: level3_0 to level3_9
Samples axis: level4_1 to level4_2
import pandas as pd
import numpy as np
from pandas.core import panelnd

Subject = panelnd.create_nd_panel_factory(
    klass_name='Subject',
    axis_orders=['setsize', 'location', 'vfield', 'channels', 'samples'],
    axis_slices={'location' : 'labels',
                 'vfield' : 'items',
                 'channels' : 'major_axis',
                 'samples': 'minor_axis'},
    slicer=pd.Panel4D,
    axis_aliases={'ss': 'setsize',
                  'loc': 'labels',
                  'vf': 'items',
                  'major': 'major_axis',
                  'minor': 'minor_axis'})


subjects = dict()
for i in range(3):
    eeg = pd.DataFrame(np.random.randn(10,2),columns=['level4_1','level4_2'],index=[ "level3_%s" % x for x in range(10)])

    loc, vf = ('level1_0','level2_0')
    subjects["level0_%s" % i] = pd.Panel4D({ loc : { vf : eeg }})

print Subject(subjects)