在Pandas DataFrame中标记列数据模式变化后的批量行
标记DataFrame中模式变化后的批量重复行
针对你的需求,我们可以通过识别连续重复值组并对比前后组的模式差异来实现标记。下面是具体的步骤和代码:
1. 先构建示例DataFrame
首先还原你的测试数据:
import pandas as pd data_list = [1521811600, 1521811600, 1521811600, 1521811601, 315964847, 315964841, 315964841, 315964841, 315964841, 315964841, 315964841, 315964841, 1521811601, 1521811601, 1521811601] df = pd.DataFrame({'data': data_list, 'flag': [0]*len(data_list)})
2. 核心解决方案:识别模式变化的批量组
我们的思路是:先把连续相同值的行划分为独立的组,然后判断哪些组是模式突变后的批量重复行,最后给这些组的flag列标记为1。
代码实现
# 第一步:给连续相同值的行分配唯一组ID df['group_id'] = (df['data'] != df['data'].shift()).cumsum() # 第二步:统计每个组的关键信息(组内数值、组长度、前后组的数值) group_stats = df.groupby('group_id').agg( group_value=('data', 'first'), group_length=('data', 'size') ).reset_index() # 添加前后组的数值,用于对比模式变化 group_stats['prev_group_value'] = group_stats['group_value'].shift(1) group_stats['next_group_value'] = group_stats['group_value'].shift(-1) # 第三步:定义模式变化的判断规则(可根据你的实际需求调整) # 这里的规则:当前组数值远小于前后的大时间戳(主流模式),且连续重复≥2次 mask = (group_stats['group_value'] < 1e9) & \ (group_stats['prev_group_value'] >= 1e9) & \ (group_stats['next_group_value'] >= 1e9) & \ (group_stats['group_length'] >= 2) # 获取需要标记的组ID marked_groups = group_stats[mask]['group_id'] # 给对应行的flag设为1 df.loc[df['group_id'].isin(marked_groups), 'flag'] = 1 # 清理临时生成的组ID列 df = df.drop('group_id', axis=1) # 查看最终结果 print(df)
运行结果
你会看到第5-11行(连续的315964841)的flag被标记为1,完全符合“模式变化后批量行”的要求:
data flag 0 1521811600 0 1 1521811600 0 2 1521811600 0 3 1521811601 0 4 315964847 0 5 315964841 1 6 315964841 1 7 315964841 1 8 315964841 1 9 315964841 1 10 315964841 1 11 315964841 1 12 1521811601 0 13 1521811601 0 14 1521811601 0
3. 灵活调整判断规则
如果你的“模式变化”不是数值大小,而是其他规则,可以修改mask的条件:
- 比如标记首次出现且连续重复≥3次的组:
mask = ~group_stats['group_value'].isin(group_stats['group_value'].shift()) & (group_stats['group_length'] >=3) - 或者标记长度超过所有组平均长度的组:
avg_length = group_stats['group_length'].mean() mask = group_stats['group_length'] > avg_length
内容的提问来源于stack exchange,提问作者sasumner
相关产品推荐
相关产品推荐

