Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:按有/过滤问题分组_Python_Pandas - Fatal编程技术网

Python 熊猫:按有/过滤问题分组

Python 熊猫:按有/过滤问题分组,python,pandas,Python,Pandas,我有一个熊猫数据帧df,看起来像这样: | Index | Item | Value | +---------+------------+-------------+ | 0 | 1024 | 20 | | 1 | 1024 | 27 | | 2 | 1024 | 19 | | 3 | 4096 | 44

我有一个熊猫数据帧
df
,看起来像这样:

| Index   | Item       | Value       |
+---------+------------+-------------+
|  0      | 1024       | 20          |
|  1      | 1024       | 27          |
|  2      | 1024       | 19          |
|  3      | 4096       | 44          |
| ...     | ...        | ...         |
现在,我可以按项目列对此数据框进行分组,并对值执行一些聚合:

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)

但最后一个只抛出一个关键错误:True

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

例如,我如何编写一个只返回中位数=mean的行的查询

谢谢。

我找到了一个解决方案:

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

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

关于“中值==mean”的问题的答案是


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


@Regenschein感谢您的更正-复制粘贴:)如果我的或其他答案有帮助,请不要忘记。谢谢
grouped[grouped.Value['count'] > 1]
df.groupby(df['Item']).filter(lambda x: x['Value'].median() == x['Value'].mean())

# One call to median(), one to mean()
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