如何根据DataFrame中FRUIT列的列表元素顺序生成STATUS布尔列?(附错误代码)
解决DataFrame中根据水果列表顺序生成状态列的问题
我来帮你搞定这个问题!首先咱们先看看你现有代码里的问题,然后一步步给出正确的实现方式。
你的代码问题分析
你写的FRUIT_STATUS函数有两个关键问题:
- 判断对象错误:
if ("PINE" in datadf['FRUIT'])是在检查整个FRUIT列是否包含"PINE",而不是当前行的水果列表,这完全偏离了每行独立判断的需求。 - 逻辑不完整:你只判断了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
相关产品推荐
相关产品推荐

