可以使用 pandas 库中的 groupby 和 rolling 函数来解决。首先按照分组条件进行分组,然后在每个组内使用 rolling 函数计算每个值在前 n-1 个值中是否与自己相同,得到一个布尔型的 rolling 对象,再使用 all 函数将其聚合成一个布尔值,表示前 n-1 个值是否都与当前值相同。最后再使用 shift 函数将这个布尔型 Series 往后移动一个位置,相邻两个位置进行比较,如果相邻两个位置都为 True,表示当前值在前 n 个值中出现了至少 n 次,则返回当前值的行号。
代码示例:
import pandas as pd
# 构造测试数据
df = pd.DataFrame({
'group': ['A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B'],
'value': ['a', 'b', 'c', 'a', 'a', 'd', 'a', 'b', 'b', 'b', 'a', 'a']
})
n = 3 # 设定连续出现次数的阈值
# 按组进行分组并使用 rolling 函数计算每个值在前 n-1 个值中是否与自己相同
rolling_obj = df.groupby('group').value.rolling(n-1).apply(lambda x: (x == x[-1]).all(), raw=True)
# 使用 shift 函数将这个布尔型 Series 往后移动一个位置
shifted_rolling_obj = rolling_obj.groupby('group').shift(periods=1)
# 如果相邻两个位置都为 True,表示当前值在前 n 个值中出现了至少 n 次,则返回当前值的行号
result = (rolling_obj & shifted_rolling_obj).reset_index(level=0, drop=True).index[0]