我正在使用优秀的pandas
包来处理大量不同的气象诊断数据,当我将数据拼接在一起时,我很快就耗尽了维度。查看文档,可能是使用MultiIndex
可能会解决我的问题,但我不确定如何将其应用到我的情况 - 文档显示了使用随机数据创建 MultiIndex 的示例和DataFrame
s,但不是具有预先存在的时间序列数据的系列。
背景
我使用的基本数据结构包含两个主要字段:
-
metadata
,这是一个由描述数字的键值对组成的字典
-
data
,这是一个包含数字本身的 pandas 数据结构。
最小公分母是时间序列数据,因此基本结构有 pandasSeries
对象作为data
条目,以及metadata
字段描述了这些数字的实际情况(例如,根据实验 Test1 预测的 24 小时东太平洋 10 米风速的矢量 RMS 误差)。
我正在考虑采用最小公分母并将各种时间序列粘合在一起,以使结果更有用并允许轻松组合。例如,我可能想查看所有不同的提前期 - 我有一个过滤器例程,它将采用共享相同元数据条目的时间序列except提前期(例如实验、区域等)并返回一个新对象,其中metadata
字段仅包含常见条目(即Lead Time
已被删除),现在data
字段是一只熊猫DataFrame
与给出的列标签Lead Time
价值。我可以再次扩展它并说我想获取生成的帧和组them仅与另一个不同的条目一起(例如Experiment
)给我一只熊猫Panel
。对于我的条目,其中项目索引由Experiment
来自组成帧的元数据值和对象的新元数据都不包含Lead Time
or Experiment
.
当我迭代这些复合对象时,我有一个iterseries
框架的例程和iterframes
当我删除一个维度时,面板会重建适当的元数据/数据配对(即,框架中的系列,其前置时间在各列之间变化,将具有其父级的所有元数据)plus the Lead Time
使用从列标签中获取的值恢复字段)。这很好用。
Problem
我已经用完了尺寸(最多 3D 面板),而且我也无法使用诸如dropna
一旦面板中的所有内容都对齐即可删除空列(这在绘制汇总统计数据时会导致一些错误)。阅读有关使用 pandas 处理高维数据的内容导致阅读有关MultiIndex
及其用途。我已经尝试过文档中给出的示例,但我仍然有点不清楚如何将其应用到我的情况。任何方向都会有用。我希望能够:
- 结合我的
Series
基于数据的多索引DataFrame
沿着任意数量的维度(这会很棒 - 它将消除一个从系列创建框架的调用,然后再消除另一个从框架创建面板的调用)
- 迭代生成的多索引
DataFrame
,删除单个维度,以便我可以重置组件元数据。
编辑 - 添加代码示例
Wes McKinney 下面的答案几乎正是我所需要的 - 问题在于一旦我开始将元素分组在一起,我必须使用的系列支持的存储对象到我的 DataFrame 支持的对象的初始转换。 Data-Frame 支持的类具有以下方法,该方法接受基于系列的对象的列表以及随列变化的元数据字段。
@classmethod
def from_list(cls, results_list, column_key):
"""
Populate object from a list of results that all share the metadata except
for the field `column_key`.
"""
# Need two copies of the input results - one for building the object
# data and one for building the object metadata
for_data, for_metadata = itertools.tee(results_list)
self = cls()
self.column_key = column_key
self.metadata = next(for_metadata).metadata.copy()
if column_key in self.metadata:
del self.metadata[column_key]
self.data = pandas.DataFrame(dict(((transform(r[column_key]), r.data)
for r in for_data)))
return self
一旦我有了这个例程给出的框架,我就可以轻松应用下面建议的各种操作 - 特别实用的是能够使用names
场当我
称呼concat
- 这消除了在内部存储列键名称的需要
因为它作为该索引维度的名称存储在 MultiIndex 中。
我希望能够实现下面的解决方案,只需获取匹配的系列支持类的列表和键列表,然后按顺序进行分组。但是,我不知道这些列将提前代表什么,所以:
- 将系列数据存储在一维 DataFrame 中对我来说确实没有意义
- 我不知道如何设置初始系列 -> 框架分组中的索引名称和列