我有以下数据框:
df = pd.DataFrame.from_dict({'case': ['foo', 'foo', 'foo', 'foo', 'bar'],
'cluster': [1, 1, 1, 2, 1],
'conf': [1, 2, 3, 1, 1]})
df
Out[3]:
case cluster conf
0 foo 1 1
1 foo 1 2
2 foo 1 3
3 foo 2 1
4 bar 1 1
如果我按照案例分组'和' cluster',我可以删除属于只有1个元素的组的元素:
df.groupby(['case', 'cluster']).filter(lambda x: len(x) > 1)
Out[4]:
case cluster conf
0 foo 1 1
1 foo 1 2
2 foo 1 3
我还可以为每个案例计算每组的平均元素数量'值:
df.groupby(['case', 'cluster']).size().mean(level='case')
Out[5]:
case
bar 1
foo 2
dtype: int64
但是,如何过滤出属于组的元素,其元素少于相应的平均值?我期待的输出是:
case cluster conf
0 foo 1 1
1 foo 1 2
2 foo 1 3
4 bar 1 1
答案 0 :(得分:5)
您可以使用组的name
参数在使用filter
时对平均组大小系列执行查找:
grp_mean = df.groupby(['case', 'cluster']).size().mean(level='case')
df = df.groupby(['case', 'cluster']).filter(lambda x: len(x) >= grp_mean[x.name[0]])
正如@MaxU指出的那样,可以通过考虑groupby
:
g = df.groupby(['case', 'cluster'])
grp_mean = g.size().mean(level='case')
df = g.filter(lambda x: len(x) >= grp_mean[x.name[0]])
结果输出:
case cluster conf
0 foo 1 1
1 foo 1 2
2 foo 1 3
4 bar 1 1
答案 1 :(得分:0)
a = 2;b =1
pd.concat( [df[(df.conf >= a) & (df.case == 'foo')], df[(df.conf >= b) & (df.case == 'bar')] ])
case cluster conf
1 foo 1 2
2 foo 1 3
4 bar 1 1