Python 使用另一个数据帧筛选数据帧

Python 使用另一个数据帧筛选数据帧,python,filter,pandas,Python,Filter,Pandas,我有一个多索引数据帧,第一级作为组id,第二级作为元素名。还有很多组,但下面只显示了第一组 2000-01-04 2000-01-05 Group Element 1 A -0.011374 0.035895 X -0.006910 0.047714 C -0.0166

我有一个多索引数据帧,第一级作为组id,第二级作为元素名。还有很多组,但下面只显示了第一组

                   2000-01-04  2000-01-05 
Group Element                                     
1       A          -0.011374    0.035895 
        X          -0.006910    0.047714 
        C          -0.016609    0.038705 
        Y          -0.088110   -0.052775 
        H           0.000000    0.008082 
我有另一个数据框,它只包含一个索引,即组id。两个数据框的列都相同,都是日期

         2000-01-04  2000-01-05 
Group                                     
1        -0.060623   -0.025429 
2        -0.066765   -0.005318 
3        -0.034459   -0.011243 
4        -0.051813   -0.019521 
5        -0.064367    0.014810 
我想使用第二个数据帧过滤第一个数据帧,方法是检查每个元素是否小于该日期组的值,以得到如下结果:

                   2000-01-04  2000-01-05 
Group Element                                     
1       A          False        False     
        X          False        False     
        C          False        False     
        Y          True         True
        H          False        False     
最终,我只对那些真实的元素和它们真实的日期感兴趣。一个在日期迭代中为真的元素列表将是非常好的,我想通过生成假NaN然后使用dropNa()来实现这一点


我知道我可以编写一堆嵌套for循环来实现这一点,但时间至关重要;我想不出一种从本质上和pythonical上使用pandas数据框架结构的方法来实现这一点。任何帮助都将不胜感激

您可以使用groupby申请:

In [11]: g = df1.groupby(level='Group')

In [12]: g.apply(lambda x: x <= df2.loc[x.name])
Out[12]: 
              2000-01-04 2000-01-05
Group Element                      
1     A            False      False
      X            False      False
      C            False      False
      Y             True       True
      H            False      False
[11]中的
:g=df1.groupby(level='Group')

在[12]:g中应用(lambda x:x非常感谢!它工作得很好。出于兴趣,df2值对应每个组的平均值。我基本上是在尝试查找异常值。有没有比我现在做的更好的方法?还有,这只是查找阈值以下的异常值;我正计划为上限创建另一个异常值。但是有吗一种更优雅的方法?@rmalhotra我想可能有,你可以访问上面lambda表达式中的组(如x),这样你就可以计算它了……让它工作以找到下面的异常值:
df.groupby(level=0)。apply(lambda x:x<(x.mean()-x.std()*2))
,但当我尝试这样做时:
df.groupby(level=0)。apply(lambda x:“Below”if x<(x.mean()-x.std()*2)else“False”)
我得到一个值错误。另外,是否也可以使用多个if语句来检查“Below”异常值?@rmalhotra我认为最好创建一个单独的函数(而不是将它放在lambda中)这将使测试变得更容易。我怀疑这是一个数组被转换为布尔值(在0.13中正确提升),您可以使用类似于您的
。where
x.where((x<(x.mean()-x.std()*2)),'Below')。但我建议使用布尔值或整数而不是字符串。例如:
def(x):mean=x.mean();std_2=x.std()*2;返回1*(xmean+std_2)