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