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

如何在pandas DataFrame中匹配产品列并判断时长阈值生成布尔新列

错误原因
  • 你代码中的if df['product'] == 'tire change'写法有误:df['product'] == 'tire change'返回的是长度和DataFrame行数一致的布尔序列,不是单个布尔值,Python原生的if/elif无法直接对整个序列做真假判断,所以抛出了对应报错。
  • 函数逻辑存在多处问题:定义的入参my_var没有被使用,第二个分支仅写了比较表达式,没有做赋值操作,就算没有报错也无法得到正确的新列。
  • 不应该用原生Python的分支判断处理pandas逐行规则逻辑,pandas自带的向量化运算方法效率更高,也不会触发这类判断错误。
正确实现方式

首先需要先把duration列从字符串格式转换为pandas的时间差格式,才能和指定时长做比较:

import pandas as pd
import numpy as np

# 先转换duration列为时间差格式
df['duration'] = pd.to_timedelta(df['duration'])

方法1:用np.where实现(适合分类少的场景)

直接用向量化判断生成新列,代码最简洁:

df['duration_bool'] = np.where(
    df['product'] == 'tire change',
    df['duration'] < pd.Timedelta(hours=4),
    df['duration'] < pd.Timedelta(hours=2)
)

方法2:用loc索引赋值(适合分类多、规则复杂的场景)

# 先给新列赋默认值False
df['duration_bool'] = False
# 匹配tire change的规则赋值
df.loc[(df['product'] == 'tire change') & (df['duration'] < pd.Timedelta(hours=4)), 'duration_bool'] = True
# 匹配oil change的规则赋值
df.loc[(df['product'] == 'oil change') & (df['duration'] < pd.Timedelta(hours=2)), 'duration_bool'] = True

两种方法都可以得到你需要的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:39:02