You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于多日Score变量计算灯泡正常工作天数?

解决灯泡首次故障天数统计问题

问题核心

你遇到的循环生成过多观测的问题,大概率是循环中错误地重复追加行,而非针对原数据集的每一行做修改。直接用Pandas向量化操作不仅高效,还能避免这类行数溢出问题。

数据集示例参考

假设你的数据集df结构如下:

Score_Day_0Score_Day_1...Score_Day_20...Score_Day_40
11...1...1
11...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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:07:05