通过比较列到多索引组来过滤pandas数据帧

时间:2015-09-28 10:10:51

标签: python pandas group-by dataframe

我有一个像下面这样的pandas DataFrame:

groups = df.groupby([df.A, df.B])
upper_bound = groups.C.mean()
upper_bound

A    B  
bar  one    0.922057
     two   -0.542803
baz  one   -0.489174
     two   -0.306407
foo  one   -0.449768
     two   -0.144346
Name: C, dtype: float64

我想要做的是在C中过滤那些小于组(A,B)平均值的值。

分组工作:

1   foo  one -0.658436

但是我现在如何过滤以便(在此示例中)行df_ = df.loc[df.C <= upper_bound.loc[df.A, df.B]] 将被删除

我尝试了以下事项:

'None of [0     foo\n1     foo\n2     foo\n3     foo\n4     bar\n5     bar\n6     bar\n7     bar\n8     baz\n9     baz\n10    baz\n11    baz\nName: A, dtype: object] are in the [index]'

但是那说

df_ = df.loc[df.C <= upper_bound[df.A, df.B]]

我试过了:

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:3824)()
pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:3492)()
TypeError: 

这让我:

groups = df.groupby([df.A])
upper_bound = groups.C.mean()
df_ = df.loc[df.C <= upper_bound.loc[df.A]

我这样做的原因是因为我已经(至少我认为)设法做了相同的&#39;事情,但有一个级别的小组:

 $scope.searchEventByDate = function (item) {
    var scheduler = $("#scheduler").data("kendoScheduler");
    scheduler.view().startDate(item.StartDate);
    scheduler.view().endDate(item.EndDate);
    scheduler.view(("day"));
    $scope.scheduler.dataSource.read();       
};

这实际上消除了df中的每一个,其中C低于upper_bound。

我做错了什么想法?

1 个答案:

答案 0 :(得分:4)

您将groupby upper_bound的结果与df['C']进行了比较,但它们的元素数量不同。使用transform获取每个组中存在的每条线的均值,并将其与df['C']进行比较。使用loc

应用此蒙版
import numpy as np

df.loc[df['C']>=df.groupby(['A','B']).transform(np.mean)['C'],]

Out[13]:
      A    B         C
0   foo  one  0.579987
3   foo  two  1.701136
5   bar  one  1.955158
7   bar  two  0.943862
9   baz  one -0.628506
10  baz  two  1.097203