熊猫:通过/过滤麻烦进行分组

时间:2016-05-17 11:36:35

标签: python pandas

我有一个pandas数据帧df,如下所示:

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

现在我可以通过Item列对此数据帧进行分组,并对值执行一些聚合:

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)

但是我得到了一个:TypeError:'function'对象不可迭代

我也试过

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

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

但最后一个只抛出KeyError:True

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

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

谢谢。

3 个答案:

答案 0 :(得分:1)

我找到了解决方案:

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

会做到的。显然,名称计数在该对象上有两个含义,因此最好使用上面的语法来引用它。

答案 1 :(得分:1)

你的问题的大熊猫方式"中位数==意味着"是

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

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

答案 2 :(得分:1)

我认为您可以使用更简单的解决方案 - 从Multiindex之前添加['Value']的列中删除agg,然后使用this

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