如何在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
相关产品推荐
相关产品推荐

