Python 使用另一个数据帧筛选数据帧
我有一个多索引数据帧,第一级作为组id,第二级作为元素名。还有很多组,但下面只显示了第一组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
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)