如何基于多日Score变量计算灯泡正常工作天数?
解决灯泡首次故障天数统计问题
问题核心
你遇到的循环生成过多观测的问题,大概率是循环中错误地重复追加行,而非针对原数据集的每一行做修改。直接用Pandas向量化操作不仅高效,还能避免这类行数溢出问题。
数据集示例参考
假设你的数据集df结构如下:
| Score_Day_0 | Score_Day_1 | ... | Score_Day_20 | ... | Score_Day_40 |
|---|---|---|---|---|---|
| 1 | 1 | ... | 1 | ... | 1 |
| 1 | 1 | ... | 10 | ... | 10 |
方法1:向量化处理(推荐)
用Pandas内置方法直接对整行操作,无需循环:
import pandas as pd # 筛选所有Score_Day开头的列 score_cols = [col for col in df.columns if col.startswith('Score_Day_')] # 生成故障标记矩阵:True表示当天灯泡停止工作 fault_flag = df[score_cols] == 10 # 获取每行第一个故障对应的列名 first_fault_col = fault_flag.idxmax(axis=1) # 从列名中提取天数并转为整数 df['Days'] = first_fault_col.str.extract(r'(\d+)').astype(int) # 处理从未故障的样本(所有天数状态都是1) never_fault = ~fault_flag.any(axis=1) df.loc[never_fault, 'Days'] = 41 # 可替换为pd.NA表示未故障
方法2:修复循环代码(若坚持用循环)
确保循环仅迭代原数据集的每一行,直接修改对应行的Days值,而非新建行:
# 先初始化Days列 df['Days'] = 0 for idx, row in df.iterrows(): # 遍历Day_0到Day_40 for day in range(41): col_name = f'Score_Day_{day}' if row[col_name] == 10: df.loc[idx, 'Days'] = day break else: # 循环正常结束(未触发break),说明灯泡全程正常 df.loc[idx, 'Days'] = 41
原循环问题分析
你之前的循环之所以生成过多观测,大概率是在循环内错误使用了pd.concat/append等追加行的操作,而非直接修改原DataFrame的对应行,导致行数被多次累加。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

