为什么我的PanelND工厂抛出一个KeyError?

时间:2013-09-11 18:26:01

标签: python pandas

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

我如何选择构建数据:

首先让我演示我对pandas.core.panelnd.creat_nd_panel_factory的使用。

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:实验条件,可以是12
  • location:一个实验条件,可以是"same""diff"None
  • vfield:实验条件,可以是"lvf"或“rvf

最后两个轴对应DataFrame的{​​{1}}和major_axis。为清晰起见,它们已重命名:

  • minor_axis:列,EEG频道(其中129个)
  • channels:行,各个样本。 samples可以作为时间轴。

我正在尝试做什么:

每个实验条件(samples x subject x setsize x location)都存储在自己的制表符分隔文件中,我正在使用{{1获取vfield对象。我想为每个主题创建一个5维面板(即pandas.read_table),其中包含该主题的所有实验条件(即DataFrame s)。

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

DataFrame

完整堆栈跟踪

Subject

我知道# ... 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) 是一个实验性功能,但我确信我做错了。有人可以指出我正确的方向吗?如果 是一个错误,那么有什么可以做的吗?

像往常一样,非常感谢你!

1 个答案:

答案 0 :(得分:3)

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

我会首先创建一个Panel4D,然后像下面一样创建你的主题。

如果您发现更多错误,请在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

代码

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)