按连续统计Pandas Python分组

时间:2016-07-01 06:51:56

标签: python python-2.7 pandas group-by

以下是数据:

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

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

2 个答案:

答案 0 :(得分:3)

试试这个:

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

大熊猫0.18中引入了{p> Series.rolling()我相信。对于早期版本,您可以使用:

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

答案 1 :(得分:0)

我认为你使用的是错误的工具 我建议使用xml解析器try BeautifulSoup如果由于某些未知原因你还打算将html数据存储在pandas中,我认为你可以迭代这些行并解析它们。
但是我建议你只需获取它并在其他地方解析它 至于嵌套标签,this可能很有用

编辑:你编辑了你的问题所以这是一个新的答案 要选择重复的行,请尝试以下操作:

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