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

Pandas DataFrame按行规则生成指定二进制列表的实现方案

问题说明

现有包含三列的DataFrame df,列名分别为mins、maxs、col,需要按规则生成二进制列表,规则如下:

  • 初始输出值默认为0
  • 若当前行col[i]小于等于mins[i],输出值切换为1,后续每行持续输出1
  • 处于输出1的状态时,直到某行col[i+n]大于等于maxs[i+n],输出值切换为0,后续每行持续输出0
  • 处于输出0的状态时,直到再次遇到col[i]小于等于mins[i]的行,再切换回输出1
  • 重复上述状态切换逻辑,直到遍历完所有行
参考示例

样例数据与对应输出如下:

colminsmaxs输出值
2160
4260
2371
5561
4381
4251
5350
4050
3381

最终生成的目标列表为[0,0,1,1,1,1,0,0,1]。

原有代码问题

你之前写的实现存在几个核心错误:

  • 循环边界设置错误,i <= len(col)会触发索引越界
  • 逻辑没有做状态循环,执行一次1值添加就直接break,无法反复切换0/1状态
  • 内层循环判断条件写反,1状态下应该持续到col >= maxs才切换,而非判断col <= maxs就持续追加1
  • 缺失初始0状态下的遍历判断逻辑
正确实现方案

用状态变量标记当前输出值,单次遍历即可完成计算,逻辑清晰无嵌套死循环风险:

def get_binary_list(col, mins, maxs):
    res = []
    # 初始状态为0
    current_state = 0
    data_length = len(col)
    for i in range(data_length):
        # 按当前状态判断是否需要切换
        if current_state == 0:
            if col[i] <= mins[i]:
                current_state = 1
        else:
            if col[i] >= maxs[i]:
                current_state = 0
        res.append(current_state)
    return res

如果直接基于pandas DataFrame处理,也可以用如下写法,适配DataFrame数据结构:

import numpy as np

def df_get_binary_list(df):
    res = []
    current_state = 0
    for _, row in df.iterrows():
        if current_state == 0 and row['col'] <= row['mins']:
            current_state = 1
        elif current_state == 1 and row['col'] >= row['maxs']:
            current_state = 0
        res.append(current_state)
    return res
效果验证

用给出的示例数据测试:

col = [2,4,2,5,4,4,5,4,3]
mins = [1,2,3,5,3,2,3,0,3]
maxs = [6,6,7,6,8,5,5,5,8]
print(get_binary_list(col, mins, maxs))
# 输出结果:[0, 0, 1, 1, 1, 1, 0, 0, 1],和预期完全匹配

内容的提问来源于stack exchange,提问作者zhlee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:51:19