- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 Ubuntu 13.04
上使用 Pandas 版本 0.12.0
。我正在尝试创建一个 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
:一个实验条件,可以是1
或者2
location
:一个实验条件,可以是"same"
, "diff"
or None
<vfield
:实验条件,可以是"lvf"
或"rvf
"最后两个轴对应于 DataFrame
的 major_axis
和 minor_axis
。为清楚起见,它们已重命名:
channels
:列,EEG channel (其中 129 个)samples
:行,单个样本。 samples
可以看作是时间轴。每个实验条件(subject
x setsize
x location
x vfield
)都存储在它自己的选项卡中-分隔文件,我正在使用 pandas.read_table
读取它,获取一个 DataFrame
对象。我想为每个主题创建一个 5 维面板(即 Subject
),其中将包含该主题的所有实验条件(即 DataFrame
)。
首先,我正在为每个主题/主题
构建一个嵌套字典:
# ... 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 Traceback (most recent call last)
<ipython-input-2-831fa603ca8f> in <module>()
----> 1 import_data()
/home/louist/Dropbox/Research/VSTM/scripts/vstmlib.py in import_data()
64
65 import ipdb; ipdb.set_trace()
---> 66 for sn, d in subjects.iteritems():
67 subjects[sn] = Subject(d)
68
/usr/local/lib/python2.7/dist-packages/pandas/core/panelnd.pyc in __init__(self, *args, **kwargs)
65 if 'dtype' not in kwargs:
66 kwargs['dtype'] = None
---> 67 self._init_data(*args, **kwargs)
68 klass.__init__ = __init__
69
/usr/local/lib/python2.7/dist-packages/pandas/core/panel.pyc in _init_data(self, data, copy, dtype, **kwargs)
250 mgr = data
251 elif isinstance(data, dict):
--> 252 mgr = self._init_dict(data, passed_axes, dtype=dtype)
253 copy = False
254 dtype = None
/usr/local/lib/python2.7/dist-packages/pandas/core/panel.pyc in _init_dict(self, data, axes, dtype)
293 raxes = [self._extract_axis(self, data, axis=i)
294 if a is None else a for i, a in enumerate(axes)]
--> 295 raxes_sm = self._extract_axes_for_slice(self, raxes)
296
297 # shallow copy
/usr/local/lib/python2.7/dist-packages/pandas/core/panel.pyc in _extract_axes_for_slice(self, axes)
1477 """ return the slice dictionary for these axes """
1478 return dict([(self._AXIS_SLICEMAP[i], a) for i, a
-> 1479 in zip(self._AXIS_ORDERS[self._AXIS_LEN - len(axes):], axes)])
1480
1481 @staticmethod
KeyError: 'location'
我知道 panelnd
是一项实验性功能,但我相当确定我做错了什么。有人可以指出我正确的方向吗?如果它是一个错误,有什么可以解决的吗?
像往常一样,非常感谢您!
最佳答案
工作示例。您需要通过切片指定轴到内部轴名称的映射。这会扰乱内部结构,但 pandas 的固定名称仍然存在(并且通过 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)
关于python - 为什么我的 PanelND 工厂抛出 KeyError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18748598/
我现在意识到实验性 PanelND 对象将非常适合我的需要,只是我无法保存它们: p4d = pd.Panel4D(np.random.randn(2, 2, 5, 4), labels=['
我在 Ubuntu 13.04 上使用 Pandas 版本 0.12.0。我正在尝试创建一个 5D 面板对象以包含一些按条件拆分的 EEG 数据。 我如何选择构建我的数据: 首先让我演示一下我对 pa
我是一名优秀的程序员,十分优秀!