2016-05-17 120 views
0

我有一个熊猫数据帧df看起来像这样:熊猫:集团具有/过滤烦恼

| Index | Item  | Value  | 
+---------+------------+-------------+ 
| 0  | 1024  | 20   | 
| 1  | 1024  | 27   | 
| 2  | 1024  | 19   | 
| 3  | 4096  | 44   | 
| ...  | ...  | ...   | 

现在我可以GROUPBY该数据帧由项目列和值进行一些聚合:

grouped = df.groupby(df['Item']).agg({'Value':['median', 'mean', 'std', 'count']}) 

如果我现在考虑这样做分组对象,它看起来像一个堆叠数据帧:

grouped.head() 

|  | Value      | 
+--------+-----------------------------+ 
|  | median | mean | std | count | 
+--------+--------+------+-----+-------+ 
| Item |  |  |  |  | 
+--------+--------+------+-----+-------+ 
| 1024 | 20 | 22.0 | 4.3 | 3  | 
| 4096 | 44 | 44.0 | NaN | 1  | 
+--------+--------+------+-----+-------+ 

我现在想只过滤分组的项目,其例如具有计数> 1,所以我尝试了以下内容:

filtered = grouped.filter(lambda x: x['count'] > 1) 

但我得到一个:类型错误:“功能”对象不是可迭代

我也试过

filtered = grouped.filter(lambda x: x.Value.count > 1) 

filtered = grouped[grouped.Age.count > 1] 

但最后一个只能扔s KeyError:True

如何在SQL中实现这种过滤,就像编写GROUP BY/HAVING子句一样,当我想过滤pandas中的聚合分组表时?

我怎么能写一个查询,只返回中位数==的行?

谢谢。

回答

1

我找到了一个解决方案:

grouped[grouped.Value['count'] > 1] 

将做到这一点。显然,名称计数在该对象上有两个含义,所以最好使用上面的语法来引用它。

1

大熊猫的方式你对“中间==意味着”问题是

df.groupby(df['Item']).filter(lambda x: x['Value'].median() == x['Value'].mean()) 

# One call to median(), one to mean() 
+0

感谢您的回答。 – Regenschein

+0

@Regenschein感谢您纠正 - 复制粘贴:) – knagaev

1

我认为你可以使用简单的解决方案 - 从agg前加入['Value']栏中移除Multiindex然后用boolean indexing

g1 = (df.groupby(df['Item'])['Value'].agg(['median', 'mean', 'std', 'count'])) 
print (g1) 

     median mean  std count 
Item        
1024  20 22 4.358899  3 
4096  44 44  NaN  1 

filtered = g1[g1['count'] > 1] 
print (filtered) 
     median mean  std count 
Item        
1024  20 22 4.358899  3 
+0

这是有帮助的,谢谢 – Regenschein

+0

如果我或其他答案有帮助,请不要忘记[接受](http://meta.stackexchange.com/a/5235/295067)。谢谢。 – jezrael