按连续计数 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 个计数