Pandas实现:为符合条件的连续行集群添加分组变量
通用实现方法
针对你的需求,我们可以利用Pandas的移位(shift)和累加(cumsum)操作,高效识别连续的True集群并完成编号,代码适用于任意行数和集群大小的数据集:
1. 导入库并创建示例DataFrame
import pandas as pd df = pd.DataFrame({'forms_a_cluster': [False, False, True, True, True, False, False, False, True, True, False, True, True, True, False]})
2. 生成集群编号
# 标记每个集群的起始行:当前行是True且上一行是False时,标记为1,否则为0 cluster_starts = df['forms_a_cluster'] & ~df['forms_a_cluster'].shift(fill_value=False) # 累加起始标记,得到每个集群的唯一编号 df['cluster_number'] = cluster_starts.cumsum() # 将非集群行的编号替换为False df['cluster_number'] = df['cluster_number'].where(df['forms_a_cluster'], False)
代码解释
df['forms_a_cluster'].shift(fill_value=False):将forms_a_cluster列向下移位一行,第一行填充False,用于对比当前行与上一行的状态。cluster_starts:仅在当前行是True且上一行是False时返回True,对应每个集群的第一行,其余行返回False。cluster_starts.cumsum():对起始标记累加,这样同一集群内的所有连续True行都会获得相同的编号(如第一个集群为1,第二个为2)。.where(df['forms_a_cluster'], False):仅保留forms_a_cluster为True的行的编号,非集群行替换为False,完全匹配你的期望输出。
最终输出
运行后df的结果与你提供的示例一致:
| forms_a_cluster | cluster_number |
|---|---|
| False | False |
| False | False |
| True | 1 |
| True | 1 |
| True | 1 |
| False | False |
| False | False |
| False | False |
| True | 2 |
| True | 2 |
| False | False |
| True | 3 |
| True | 3 |
| True | 3 |
| False | False |
内容的提问来源于stack exchange,提问作者pd441
相关产品推荐
相关产品推荐

