按连续计数 Pandas Python 分组 [关闭]

Posted

技术标签:

【中文标题】按连续计数 Pandas Python 分组 [关闭]【英文标题】:Group by consecutive count Pandas Python [closed] 【发布时间】:2016-11-03 11:29:13 【问题描述】:

这是数据:

ID  Type
1   In
1   In
1   Out
1   In
2   Out
2   In
2   In
2   In
2   Out

问题:我想要一个可以获取“In”连续出现超过 2 次的 ID 的 pandas 查询。因此,如果我对上述数据运行查询,它应该只获取我 2 个。

【问题讨论】:

你为什么用熊猫? 我认为最好的方法是删除问题,并使用纯文本(不是 html)的一些示例和一些代码创建新的,你会尝试什么。然后你会得到多个不错的答案。 【参考方案1】:

我认为您使用了错误的工具。 我建议使用 xml 解析器尝试 BeautifulSoup,如果由于某种未知原因您仍计划将 html 数据存储在 pandas 中,我认为您可以遍历这些行并解析它们。 但是,我建议您只获取它并在其他地方解析它。 至于嵌套标签,this 可能有用

编辑:您编辑了您的问题,所以这是一个新的答案 为了选择重复的行试试这个:

df.groupby([...]).filter(lambda df:df.shape[0] > 1)

【讨论】:

非常抱歉各位!新手你看!我有行和列中的数据,但我不确定如何表示数据... 让我知道这个新编辑是否有效,如果有效,请考虑接受【参考方案2】:

试试这个:

df.groupby('ID')['Type'].agg(lambda x: (x=='In').rolling(3).apply(lambda x: x.all()).max())
Out[34]: 
ID
1    0.0
2    1.0
Name: Type, dtype: float64

对符合条件的组返回 1,否则返回 0。

它首先按 ID 分组并采用 Type 列。对于您的示例,它有两个组:1: ['In', 'In', 'Out', 'In'], 2: ['Out', 'In', 'In', 'In', 'Out']。对于每个组 (x),它首先创建一个布尔系列 x=='In'。系列是[True, True, False, True][False, True, True, True, False]。现在,在这些系列上,它应用了滚动功能。它一次需要三个并评估x.all()。对于第一组,前三个 ([True, True, False]) 和后三个 ([True, False, True]) 返回 False,因为这三个都应该是 True。这两个 False 的最大值为 0。对于第二组,滚动方法将产生 ([False, True, True], [True, True, True], [True, True, False]),因此对于第二组 x.all() 将是 True,因此最大值将为 1。

Series.rolling() 我相信是在 pandas 0.18 中引入的。对于早期版本,您可以使用:

df.groupby('ID')['Type'].agg(lambda x: pd.rolling_apply(x=='In', 3, lambda x: x.all()).max())

【讨论】:

上面写着 AttributeError: 'Series' object has no attribute 'rolling' 我在 Python 2.7 anaconda dist 您可能需要更新 pandas。您需要 v18.0。或者你可以使用 rolling_apply。 谢谢@ayhan先生!一切都像魔术一样......我希望这个问题能够受到保护。是否愿意解释这个答案,以便保持记录? 当然,我添加了解释。如果有任何不清楚的地方,请告诉我。 这是最清楚的!非常感谢!

以上是关于按连续计数 Pandas Python 分组 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用 pandas 在数据帧上执行 groupby,按计数排序并获取 python 中的前 2 个计数

对 pandas 数据框中的连续值进行分组

MySQL:按连续天分组并计数组

在熊猫数据框中按日期和计数值分组

在 pandas / python 中对条件值进行分组和计数

Pandas Python - 计数和分组日期时间索引