如何在Pandas DataFrame中实现:仅保留Combined_Decision首次为TRUE的记录,后续TRUE需忽略直至Decision_A出现新的TRUE
解决思路和代码实现
这个需求核心是要按Decision_A的True值划分数据块,然后在每个块里只保留Combined_Decision首次出现的True记录。我之前处理过类似的分组过滤场景,用Pandas的groupby结合累积统计就能轻松实现,下面一步步来:
1. 先准备示例数据(方便你测试)
先构造一个和你场景匹配的DataFrame,包含各种边界情况:
import pandas as pd data = { "Decision_A": [False, False, True, False, False, True, False, False, False], "Combined_Decision": [True, False, False, True, True, False, True, False, True] } df = pd.DataFrame(data)
2. 生成分组键
我们需要把数据分割成一个个以Decision_A == True为分界的连续组。利用布尔值转整数后累加的特性,用cumsum()生成分组标识:
df["group_id"] = df["Decision_A"].cumsum()
这样,每次遇到Decision_A == True,group_id就会加1,把后续的行归为新的分组。
3. 标记需要保留的行
在每个分组内,我们只保留Combined_Decision == True的首次出现。可以用groupby结合transform,通过累积计数判断是否是首次出现:
df["keep_row"] = df.groupby("group_id")["Combined_Decision"].transform( lambda x: x.cumsum() == 1 )
这里x.cumsum()会统计每个分组内Combined_Decision的True出现次数,当次数等于1时,就是该组内的首次True,标记为True。
4. 过滤得到结果
最后筛选出标记为keep_row == True的行,再去掉临时列即可:
result_df = df[df["keep_row"]].drop(columns=["group_id", "keep_row"])
如果你的需求是保留所有行,但把分组内非首次的Combined_Decision=True改为False,可以用下面的代码替换步骤3和4:
df["Combined_Decision_filtered"] = df.groupby("group_id")["Combined_Decision"].transform( lambda x: x & (x.cumsum() == 1) )
这样原始的DataFrame会新增一列,只保留每个分组内首次出现的True值。
验证结果
拿示例数据测试的话,最终result_df会包含3行:
- 第一组(group_id=0)的第1行(
Combined_Decision=True) - 第二组(group_id=1)的第4行(
Combined_Decision=True) - 第三组(group_id=2)的第7行(
Combined_Decision=True)
完全符合你的需求。
内容的提问来源于stack exchange,提问作者VJKR
相关产品推荐
相关产品推荐

