2016-06-13 130 views
0

我试图限制由描述输出返回的输出到只有那些计数大于或等于任何给定数量的记录的子集。熊猫:过滤描述输出(计数)

我的数据帧是一个较大的一个子集,并且被定义为:

df = evaluations[['score','garden_id']] 

当运行描述此,

df.groupby('garden_id').describe() 

我想过滤返回的数据的那些记录数>指定的数字。

我的输出看起来像:

Out[39]: 
       score 
garden_id    
37254  count  6 
      mean  20 
      std  0 
      min  20 
      25%  20 
      50%  20 
      75%  20 
      max  20 
37273  count  1 
      mean  17 
      std  NaN 
      min  17 
      25%  17 
      50%  17 
      75%  17 
      max  17 
37284  count  1 
      mean  19 
      std  NaN 
      min  19 
      25%  19 
      50%  19 
      75%  19 
      max  19 
37288  count  1 
      mean  11 
      std  NaN 
      min  11 
      25%  11 
      50%  11 
       ... 

我要去尝试修改类似:modify-output-from-python-pandas-describe,但我只得到这样的:

Out[40]: 
Empty DataFrame 
Columns: [score] 
Index: [] 

当我运行df.groupby('garden_id').describe().loc[['count']]

我做尝试newframe = df.groupby('garden_id').describe().count() > 3,但我得到一个掩码显示哪些记录是真实的,哪些是错误的,所以不太确定如何使用它。

有没有一种方法可以直接使用describe方法过滤掉所需的记录,而无需处理数据屏蔽等?

+0

@ horcle什么是ou你在追求什么? – Merlin

+0

@jezrael显然明白我想要什么:我想为描述输出中的计数设置一个阈值,然后找出哪个garden_ids符合这个标准。 –

+0

。@ horcle。您不限制.describe()的输出。输出是相同的。 – Merlin

回答

2

我认为你可以使用slicers选择,然后boolean indexing寻找indexidx1,其中面具是True

import pandas as pd 

df = pd.DataFrame({'score':[1,2,3,3,1,2], 
        'garden_id':[1,1,1,1,2,2]}) 

print (df) 
    garden_id score 
0   1  1 
1   1  2 
2   1  3 
3   1  3 
4   2  1 
5   2  2 

newframe = df.groupby('garden_id').describe() 
print (newframe) 
        score 
garden_id     
1   count 4.000000 
      mean 2.250000 
      std 0.957427 
      min 1.000000 
      25% 1.750000 
      50% 2.500000 
      75% 3.000000 
      max 3.000000 
2   count 2.000000 
      mean 1.500000 
      std 0.707107 
      min 1.000000 
      25% 1.250000 
      50% 1.500000 
      75% 1.750000 
      max 2.000000 
idx = pd.IndexSlice 
mask = newframe.loc[idx[:,'count'],:] > 3 
print (mask) 
       score 
garden_id    
1   count True 
2   count False 

idx1 = mask[mask.values].index.get_level_values('garden_id') 
print (idx1) 
Int64Index([1], dtype='int64', name='garden_id') 

print (newframe.loc[idx[idx1,:],:]) 
        score 
garden_id     
1   count 4.000000 
      mean 2.250000 
      std 0.957427 
      min 1.000000 
      25% 1.750000 
      50% 2.500000 
      75% 3.000000 
      max 3.000000 
+0

工程就像一个魅力。 –

0

如果你在寻找得分的次数大于3 试试这个:

df2 = df.groupby('garden_id').count() 
df2[df2['score']> 3]