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 - 重复上述状态切换逻辑,直到遍历完所有行
参考示例
样例数据与对应输出如下:
| col | mins | maxs | 输出值 |
|---|---|---|---|
| 2 | 1 | 6 | 0 |
| 4 | 2 | 6 | 0 |
| 2 | 3 | 7 | 1 |
| 5 | 5 | 6 | 1 |
| 4 | 3 | 8 | 1 |
| 4 | 2 | 5 | 1 |
| 5 | 3 | 5 | 0 |
| 4 | 0 | 5 | 0 |
| 3 | 3 | 8 | 1 |
最终生成的目标列表为[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
相关产品推荐
相关产品推荐

