我有一个像下面这样的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。
我做错了什么想法?
答案 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