我有数据框
ID | filter1 | filter2 |
---|---|---|
0 | False | False |
1 | False | True |
2 | False|| |假 | 3 |
真 | 假 | 4 |
假 | 假 | 5 |
假 | 真 | 6 |
真 | 真 | 7 |
正确 | 错误 | 8 |
正确 | 错误 | 9 |
错误 | 错误 | 10 |
错误 | 错误|| |11 | False |
False | 12 | False |
True | 我想找到每个带有filter1=True且连续filter2=True的序列 | 预期的输出是:| ||ID |
过滤器1
过滤器2
预期结果 | 描述 | 0 | 假 | 假 |
---|---|---|---|---|
假 | 1 | 假 | 真 | |
False | filter1中之前没有True | 2 | False | False |
False | 3 | True | False | |
False | 开始条件| ||4 | False | False | False |
5 | False | True | True | |
关闭 ID=3 的条件 | 6 | True|| |True | True | 在同一行 |
7 | True | False | False | 这里是开始条件 |
8 | True | False|| |False | 这是开始条件 - 我们再次开始 | 9 |
False | False | False | 10 | False |
False | False | 11 | False | |
False | False | 12 | False | |
True | True | 从 ID=8 开始关闭条件 | False | |
12 | False | True | True | Close condition from ID=8 |
import pandas as pd
# 示例数据
df = pd.DataFrame({
'ID': range(13),
'filter1': [False, False, False, True, False, True, True, True, True, False, False, False, True],
'filter2': [False, True, False, False, True, True, True, False, False, False, False, True, True]
})
# 使用布尔索引和 `cumsum` 查找连续组
df['group'] = (df['filter1'] & df['filter2']).cumsum()
# 过滤掉 `filter1` 为 False 的组
result = df[df['filter1']]['group'].unique()
# 获取每个组的开始和结束 ID
output = df[df['group'].isin(result)].groupby('group')['ID'].agg(['min', 'max'])
# 打印输出
print(output)
这将输出以下结果:
min max
group
2 5 6
3 8 12
此代码的工作原理如下:
- 创建连续组:
-
df['filter1'] & df['filter2']
创建了一个布尔序列,其中filter1
和filter2
都为 True。 -
cumsum()
函数计算此布尔序列的累积总和,从而为连续的 True 值创建组。 -
过滤掉
filter1
为 False 的组: -
df[df['filter1']]
选择filter1
为 True 的行。 -
.unique()
获取这些行中的唯一组 ID。 -
获取每个组的开始和结束 ID:
-
df[df['group'].isin(result)]
选择属于已识别组的行。 -
groupby('group')
按组对数据进行分组。 -
agg(['min', 'max'])
计算每个组的最小(开始)和最大(结束)ID。
此代码有效地识别了满足条件的连续序列,并为提供了每个序列的开始和结束 ID。
标签:python,pandas,dataframe From: 78840659