将pandas.Panel与每个项目的系列数据进行比较

时间:2016-03-30 16:31:13

标签: python pandas

所以我有一个pandas面板,其中包含一个数据框,其中包含每个面板项的时间序列数据。我现在想要做的是将每个项目与一组参考数据进行比较,以确定项目数据是否随时超过参考数据,以便构建超出参考数据的所有项目的列表。因此,我的目的是构建一个布尔数据面板,并使用any()来减少它,以产生一个掩盖项目的1D结构。 如果我想考虑单个数据帧进行比较,那么比较成功就好了,但如果我尝试将整个面板与一个系列进行比较,那么我会找回一个数据帧而不是一个面板。

>>>datapanel = pd.Panel(...)
>>>datapanel
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 10 (major_axis) x 3 (minor_axis)
Items axis: a to b
Major_axis axis: 0 to 9
Minor_axis axis: x to z

>>>refdata = pd.DataFrame(...)
>>>refdata
     x
3  0.1
4  0.2
>>>time_min = 3
>>>time_max = 4

# This comparison works as expected
>>>datapanel.ix['a',tmin:tmax,'x'] > refdata.ix[tmin:tmax,'x']
3    True
4    True

# This is what I want to do:
>>>datapanel.ix[:,tmin:tmax,'x'] > refdata.ix[tmin:tmax,'x']
       a      b      3      4
3  False  False  False  False
4  False  False  False  False
# but it gives a dataframe not a panel

我如何得到我想要的东西?我不一定需要一个完整的布尔数据面板,但我当然需要一种方法来允许有效地将布尔表达式应用于面板中的每个项目,并根据它构建项目的掩码对象。

1 个答案:

答案 0 :(得分:0)

我的最终解决方案是[Panel.select()]方法,它接受一个返回布尔值作为参数的函数,并依次为每个Panel项调用该函数,将索引作为参数传递给函数。 / p>

datapanel.select(lambda id: (datapanel.ix[id,tmin:tmax,'x'] > refdata.ix[tmin:tmax,'x']).any())

或者,因为在原始问题中我要求列出符合指定标准的所有项目

datapanel.select(lambda id: (datapanel.ix[id,tmin:tmax,'x'] > refdata.ix[tmin:tmax,'x']).any()).items