Python/Pandas逐行统计非连续1值簇并按ID分组导出的实现方法
解决方案
实现思路
- 先固定数值列的处理顺序,和输入DataFrame的列顺序保持一致,确保连续1的结束位置识别准确
- 逐行对0/1序列做连续块标记:通过掩码识别1的位置,碰到0就给后续的1打新的分组标签,相同标签的为同一个连续1簇
- 按簇分组统计长度,同时取每个簇最后一个位置对应的列名作为标识
- 按要求格式化输出到txt文件,11000行的数据量处理无压力
完整可运行代码
import pandas as pd # ---------------------- 数据读入部分 ---------------------- # 此处替换为你自己的数据源读取逻辑,比如 pd.read_excel("你的文件路径.xlsx") df = pd.DataFrame({ 'ID': [335344, 358213, 358249, 365663], '20-21': [0,1,0,0], '19-20': [0,1,0,0], '18-19': [1,0,0,0], '17-18': [1,1,0,1], '16-17': [1,1,0,1], '15-16': [0,1,0,1], '14-15': [0,1,0,1], '13-14': [0,0,0,1], '12-13': [0,1,0,0], '11-12': [0,0,0,0] }) # 提取所有数值列(排除ID列,保留原列顺序) value_columns = [col for col in df.columns if col != 'ID'] # ---------------------- 核心处理逻辑 ---------------------- def parse_continuous_clusters(row): val_sequence = row[value_columns].values col_sequence = row[value_columns].index # 筛选出值为1的位置掩码 one_mask = val_sequence == 1 # 全0行直接返回空结果 if not one_mask.any(): return [] # 给连续的1打分组标签 block_tags = (~one_mask).cumsum()[one_mask] # 按标签分组统计每个簇的结束列和长度 cluster_list = [] for tag, group in pd.Series(col_sequence[one_mask]).groupby(block_tags): cluster_list.append((group.iloc[-1], len(group))) return cluster_list df['cluster_result'] = df.apply(parse_continuous_clusters, axis=1) # ---------------------- 导出到TXT文件 ---------------------- with open("output_result.txt", "w", encoding="utf-8") as f: for _, row in df.iterrows(): clusters = row['cluster_result'] # 若需要保留全0的ID,可注释掉下面这行判断 if not clusters: continue f.write(f"{row['ID']}\n") for end_col, count in clusters: f.write(f" {end_col}: {count}\n") # 每个ID之间加空行分隔 f.write("\n")
注意事项
- 运行后会在当前目录生成
output_result.txt,格式和你要求的预期输出完全一致 - 如果需要保留全0的ID记录,删掉导出部分的
if not clusters: continue即可 - 数值列的处理顺序完全沿用输入DataFrame的列顺序,不需要额外调整排序
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

