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

如何根据DataFrame中FRUIT列的列表元素顺序生成STATUS布尔列?(附错误代码)

解决DataFrame中根据水果列表顺序生成状态列的问题

我来帮你搞定这个问题!首先咱们先看看你现有代码里的问题,然后一步步给出正确的实现方式。

你的代码问题分析

你写的FRUIT_STATUS函数有两个关键问题:

  1. 判断对象错误:if ("PINE" in datadf['FRUIT'])是在检查整个FRUIT列是否包含"PINE",而不是当前行的水果列表,这完全偏离了每行独立判断的需求。
  2. 逻辑不完整:你只判断了PINE是否存在,完全没考虑它和ORANGE的位置顺序,而且函数一进入判断就直接return,导致所有行的结果都会一模一样,根本没法生成符合要求的STATUS列。

正确的实现方案

首先咱们先把初始的DataFrame构造好(记得先导入pandas):

import pandas as pd

datadf = pd.DataFrame({
    'ID': ['1000', '1001', '1002', '1003','1004','1005','1006'], 
    'FRUIT': [["ORANGE","ORANGE"],["ORANGE","PINE"],["PINE","ORANGE"],["PINE","PINE","ORANGE"],["ORANGE","PINE","ORANGE"],["ORANGE","PINE"],["ORANGE","ORANGE","PINE"]]
})

接下来写一个能正确处理每行水果列表的函数:

def get_fruit_status(fruit_list):
    # 获取PINE第一次出现的索引,不存在就设为无穷大
    pine_pos = fruit_list.index("PINE") if "PINE" in fruit_list else float('inf')
    # 获取ORANGE第一次出现的索引,不存在就设为无穷大
    orange_pos = fruit_list.index("ORANGE") if "ORANGE" in fruit_list else float('inf')
    
    # 只有当PINE确实存在且出现位置早于ORANGE时,返回"TRUE",否则都是"FALSE"
    return "TRUE" if pine_pos < orange_pos else "FALSE"

把这个函数应用到FRUIT列上,生成STATUS列:

datadf['STATUS'] = datadf['FRUIT'].apply(get_fruit_status)

验证结果

运行后你会得到符合预期的DataFrame:

ID                  FRUIT STATUS
0  1000        [ORANGE, ORANGE]  FALSE
1  1001        [ORANGE, PINE]  FALSE
2  1002        [PINE, ORANGE]   TRUE
3  1003  [PINE, PINE, ORANGE]   TRUE
4  1004  [ORANGE, PINE, ORANGE]  FALSE
5  1005        [ORANGE, PINE]  FALSE
6  1006  [ORANGE, ORANGE, PINE]  FALSE

更简洁的Lambda写法

如果你喜欢紧凑的代码,也可以用lambda表达式实现同样的逻辑:

datadf['STATUS'] = datadf['FRUIT'].apply(
    lambda lst: "TRUE" if ("PINE" in lst and "ORANGE" in lst and lst.index("PINE") < lst.index("ORANGE")) else "FALSE"
)

这个逻辑和上面的函数完全一致,只是把判断逻辑直接写在了lambda里,适合简单场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:53:11