我有一个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
子句一样?
我怎么能写一个只返回中位数==平均值的行的查询?
谢谢。
答案 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