如何在Pandas中基于两个阈值为DataFrame分配新列值?
解决方案
首先必须先将字符串类型的logvalue转换为数值类型,否则无法进行数值比较。以下是几种可靠的实现方式:
方法一:使用numpy.where(直观易懂)
import pandas as pd import numpy as np # 先转换logvalue为数值类型,errors='coerce'将非数值内容转为NaN df_x['logvalue'] = pd.to_numeric(df_x['logvalue'], errors='coerce') # 应用规则创建新列 df_x['violatedInstances'] = np.where( (df_x['logvalue'] >= 15) & (df_x['logvalue'] <= 20), 0, 1 )
注:如果确定
logvalue都是合法数值,也可以用df_x['logvalue'].astype(float)完成转换,pd.to_numeric的优势是能灵活处理异常值。
方法二:使用Pandas.between(简洁高效)
import pandas as pd # 转换类型 df_x['logvalue'] = pd.to_numeric(df_x['logvalue'], errors='coerce') # between默认匹配闭区间[15,20],返回布尔值;取反后转int(True→1,False→0) df_x['violatedInstances'] = (~df_x['logvalue'].between(15, 20)).astype(int) # 也可以用以下写法,效果完全一致: # df_x['violatedInstances'] = 1 - df_x['logvalue'].between(15, 20).astype(int)
方法三:使用apply(适合自定义复杂逻辑,小数据量适用)
import pandas as pd df_x['logvalue'] = pd.to_numeric(df_x['logvalue'], errors='coerce') def judge_violation(val): if pd.isna(val): # 处理转换后为NaN的异常值,这里默认标记为违规(赋值1),可按需调整 return 1 return 0 if 15 <= val <=20 else 1 df_x['violatedInstances'] = df_x['logvalue'].apply(judge_violation)
关键注意点
- 类型转换是核心:字符串无法直接与数值比较,这是多数尝试失败的根本原因。
- 异常值处理:如果
logvalue包含非数值字符串,pd.to_numeric(..., errors='coerce')会将其转为NaN,可根据业务需求决定这类值的标记结果。
内容的提问来源于stack exchange,提问作者Niro Mal
相关产品推荐
相关产品推荐

