删除大小小于pandas中平均组大小的组

时间:2017-05-10 17:47:14

标签: python pandas

我有以下数据框:

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

2 个答案:

答案 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