Python 2.7 保持多索引条件的数据帧子集

Python 2.7 保持多索引条件的数据帧子集,python-2.7,pandas,dataframe,multi-index,Python 2.7,Pandas,Dataframe,Multi Index,我目前有一个包含数百万行的数据帧。它当前按ID和eventdate分组。对于每个ID,都有一个日期范围,其中包含相应的重量和滚动平均重量(即滚动14天的平均重量) 我需要这个数据框的一个子集,它保留所有eventdate行,但只返回ID,因为整个日期范围的roll_mean_权重大于1.5。因此,如果ID 1的roll_mean_weight>1.5中有一个值,则返回该ID的所有行 我试过很多方法,但似乎都没有效果。比如: a=df.ix[(df['roll_mean_weight'] >

我目前有一个包含数百万行的数据帧。它当前按ID和eventdate分组。对于每个ID,都有一个日期范围,其中包含相应的重量和滚动平均重量(即滚动14天的平均重量)

我需要这个数据框的一个子集,它保留所有eventdate行,但只返回ID,因为整个日期范围的roll_mean_权重大于1.5。因此,如果ID 1的roll_mean_weight>1.5中有一个值,则返回该ID的所有行

我试过很多方法,但似乎都没有效果。比如:

a=df.ix[(df['roll_mean_weight'] >1.5)]
但这只返回与条件匹配的eventdates和ID行

 a.head()
                    weight  roll_mean_weight
cuid    eventdate                           
1      2013-10-21      19          1.571429
       2013-10-22       0          1.571429
       2013-10-23       0          1.571429
3      2013-10-10       3          1.571429
       2013-10-11       1          1.571429
任何想法都很好,谢谢

创建一些数据(函数MultiIndex.from_乘积在0.13.1中是新的,但不相关 解决问题;它只是方便地创建了一个mi)

创建一些我们知道是真实的数据

In [33]: df.loc[['e']] += 10

In [34]: df.loc[['c']] += 10

In [35]: df
Out[35]: 
                   value
l1 l2                   
a  2013-01-01   1.644561
   2013-01-02   1.815067
   2013-01-03  -0.015403
   2013-01-04   0.381268
b  2013-01-01  -3.101670
   2013-01-02   2.087237
   2013-01-03   1.878045
   2013-01-04  -0.713234
c  2013-01-01   9.493884
   2013-01-02  10.333547
   2013-01-03  11.104055
   2013-01-04   8.678834
d  2013-01-01   0.862161
   2013-01-02  -1.128578
   2013-01-03  -0.896620
   2013-01-04   1.571880
e  2013-01-01   9.523882
   2013-01-02  11.980969
   2013-01-03   8.759344
   2013-01-04  11.695152

[20 rows x 1 columns]
一级分组;仅显示所有值均大于0的组

In [36]: df.groupby(level=0).filter(lambda x: (x['value']>0).all())
Out[36]: 
                   value
l1 l2                   
c  2013-01-01   9.493884
   2013-01-02  10.333547
   2013-01-03  11.104055
   2013-01-04   8.678834
e  2013-01-01   9.523882
   2013-01-02  11.980969
   2013-01-03   8.759344
   2013-01-04  11.695152

[8 rows x 1 columns]

谢谢即使对于庞大的数据集,这也非常有效。刚刚将
.all()
更改为
.any()
.gr8!您可以执行任何想要的条件(只要它最终返回布尔值)。(如果函数复杂,也可以使用命名函数)
In [33]: df.loc[['e']] += 10

In [34]: df.loc[['c']] += 10

In [35]: df
Out[35]: 
                   value
l1 l2                   
a  2013-01-01   1.644561
   2013-01-02   1.815067
   2013-01-03  -0.015403
   2013-01-04   0.381268
b  2013-01-01  -3.101670
   2013-01-02   2.087237
   2013-01-03   1.878045
   2013-01-04  -0.713234
c  2013-01-01   9.493884
   2013-01-02  10.333547
   2013-01-03  11.104055
   2013-01-04   8.678834
d  2013-01-01   0.862161
   2013-01-02  -1.128578
   2013-01-03  -0.896620
   2013-01-04   1.571880
e  2013-01-01   9.523882
   2013-01-02  11.980969
   2013-01-03   8.759344
   2013-01-04  11.695152

[20 rows x 1 columns]
In [36]: df.groupby(level=0).filter(lambda x: (x['value']>0).all())
Out[36]: 
                   value
l1 l2                   
c  2013-01-01   9.493884
   2013-01-02  10.333547
   2013-01-03  11.104055
   2013-01-04   8.678834
e  2013-01-01   9.523882
   2013-01-02  11.980969
   2013-01-03   8.759344
   2013-01-04  11.695152

[8 rows x 1 columns]