如何筛选含1-0-1中断模式的ID?月度dummy列数据集处理
解决方案
针对你的需求(识别月度序列中存在「两个1之间夹0」的ID并标记),以下是两种主流数据处理工具的高效实现方法,适配26万行的大数据量:
Python(Pandas)
方法1:基于差分判断(高效矢量化操作)
核心逻辑:如果序列中同时出现「1→0」(差分=-1)和「0→1」(差分=+1),说明存在中断模式。
import pandas as pd # 假设你的数据集已读入为df df = pd.read_csv("your_data.csv") # 筛选所有月度dummy列(列名以m开头) month_cols = [col for col in df.columns if col.startswith('m')] # 计算每行月度列的相邻差分 df_diff = df[month_cols].diff(axis=1) # 标记是否存在中断模式:同时出现过1→0和0→1的转换 df['has_interruption'] = (df_diff.eq(-1).any(axis=1)) & (df_diff.eq(1).any(axis=1))
方法2:基于字符串匹配(直观易理解)
核心逻辑:将每行的月度序列转为字符串,匹配「1后面跟着至少一个0再跟1」的模式(正则10+1)。
import pandas as pd df = pd.read_csv("your_data.csv") month_cols = [col for col in df.columns if col.startswith('m')] # 拼接每行的月度值为字符串,再匹配中断模式 df['has_interruption'] = df[month_cols].astype(str).agg(''.join, axis=1).str.contains(r'10+1')
两种方法均为矢量化操作,处理26万行数据速度极快,推荐优先使用方法1。
R语言
方法1:字符串匹配(高效无循环)
library(dplyr) library(stringr) # 读入数据 df <- read.csv("your_data.csv") # 筛选月度列 month_cols <- starts_with("m", vars = colnames(df)) # 拼接每行月度值为字符串,匹配中断模式 df <- df %>% mutate(has_interruption = str_detect(do.call(paste0, across(all_of(month_cols))), "10+1"))
方法2:基于差分判断
library(dplyr) df <- read.csv("your_data.csv") month_cols <- starts_with("m", vars = colnames(df)) # 按行计算差分并判断 df <- df %>% rowwise() %>% mutate( diff_vals = diff(c_across(all_of(month_cols))), has_interruption = any(diff_vals == -1) & any(diff_vals == 1) ) %>% ungroup() %>% select(-diff_vals)
注意:rowwise()在处理26万行时速度略慢,优先推荐方法1。
结果验证
以你提供的示例数据为例:
- ID
07W77348、07W79970、07W83630会被标记为True(存在中断) - ID
07W85211(全1)、07W90765(先0后1再0)、08W03543(先1后0)等会被标记为False
内容的提问来源于stack exchange,提问作者susznik
相关产品推荐
相关产品推荐

