Pandas groupby,过滤并将输出放入列表中
Posted
技术标签:
【中文标题】Pandas groupby,过滤并将输出放入列表中【英文标题】:Pandas groupby, filter and put the output in a list 【发布时间】:2018-01-22 15:44:42 【问题描述】:大家好,我想在我的代码中实现的这个函数有问题。假设我正在处理这个数据框。
df = pd.DataFrame([[100, 1],[100, 1],[200, 2],[200, 2],[200, 2]], columns=['a','b'])
现在我想先计算“a”列的唯一条目,然后过滤选择“a”列中大于 3 的元素
group=df.groupby('a').count()
filter=group['b'].isin([3])
所需的输出是一个列表,其中仅包含“a”系列中满足过滤条件的那些元素(名为“filter”),因此可以从这个新功能中过滤回初始过滤器,以便 i将只保留第 2、3、4 行(从零开始计数)。
我希望我的意图很明确,但当然,如果我从错误的角度处理问题,欢迎提出任何建议。
【问题讨论】:
“更简单的方法”是什么意思?你的代码不起作用。或者这应该是伪代码来说明,你试图做什么?也许您想阅读How to create a Minimal, Complete, and Verifiable example? '一种更简单的方法'意味着我可能从错误的角度来解决问题......是的,这段代码实际上不起作用,所以意味着过滤后我无法返回过滤后的系列作为列表。a.tolist()
和 filter.isin([3])
由于不同的原因无法正常工作。我只能鼓励你阅读链接,我发布了。玩具数据输入/输出通常非常有助于说明问题。如果我是你,我会相应地编辑问题。
期望的输出是什么?结帐this SO page 了解如何创建一个好的示例。
【参考方案1】:
IIUC,我认为您没有足够的测试数据来测试“大于 3”,但是您可以测试“大于 2”。
df[df.groupby('a')['a'].transform('count').gt(2)]
输出:
a b
2 200 2
3 200 2
4 200 2
【讨论】:
感谢您的回答。无论如何,首先我想计算“200”出现的次数,然后(因为它出现 3 次)过滤值。 @Frank_Mrn 这就是我在这里所做的。 groupby('a')['a'] 计算 ['a'] 的每个值出现的次数,如果该值超过 2,则我们使用布尔索引仅显示这些行。【参考方案2】:In [1]: import pandas as pd
In [2]: df = pd.DataFrame([[100, 1],[100, 1],[200, 2],[200, 2],[200, 2]], columns=['a','b'])
In [3]: pd.concat([i[1] for i in df.groupby('a') if len(i[1]) >2 ])
Out[3]:
a b
2 200 2
3 200 2
4 200 2
【讨论】:
以上是关于Pandas groupby,过滤并将输出放入列表中的主要内容,如果未能解决你的问题,请参考以下文章
pandas 中的新列 - 通过应用列表 groupby 将系列添加到数据框