以下是数据:
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。
答案 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
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)