Python:基于days列多条件生成新列的方法及if替代方案
DataFrame条件列创建实现及替代方案
先明确需求逻辑
根据days列的值生成新列new_colum:
- 当
days < 180时,值为'y' - 当
180 < days < 365时,值为'd' - 当
days ≥ 365时,值为'h'
一、用if条件结合apply实现
先修正你原代码的语法问题:elif( days >180 & < 365)是错误写法,Python中正确的区间判断要么用链式比较180 < day < 365,要么用逻辑与(day > 180) & (day < 365)(pandas中布尔运算需加括号,避免优先级问题)。
具体代码:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({'days': [190, 567, 55]}) # 定义条件判断函数 def get_new_value(day): if day < 180: return 'y' elif 180 < day < 365: return 'd' else: return 'h' # 应用函数生成新列 df['new_colum'] = df['days'].apply(get_new_value)
运行后结果:
| days | new_colum |
|---|---|
| 190 | d |
| 567 | h |
| 55 | y |
这种方法逻辑直观,但数据量较大时,apply的效率不如向量化操作。
二、更高效的替代方案
1. 使用numpy.select(推荐大数据量场景)
np.select是向量化操作,直接对整列进行条件判断,效率远高于apply:
import pandas as pd import numpy as np df = pd.DataFrame({'days': [190, 567, 55]}) # 定义条件列表和对应结果列表 conditions = [ df['days'] < 180, (df['days'] > 180) & (df['days'] < 365), df['days'] >= 365 ] choices = ['y', 'd', 'h'] # 生成新列 df['new_colum'] = np.select(conditions, choices, default='h')
np.select会按顺序匹配第一个满足的条件,default参数可兜底处理未匹配到的情况。
2. 使用pd.cut(适合区间划分场景)
如果逻辑是基于连续区间划分,pd.cut是更简洁的选择:
import pandas as pd df = pd.DataFrame({'days': [190, 567, 55]}) # 定义区间边界和对应标签 bins = [-float('inf'), 180, 365, float('inf')] labels = ['y', 'd', 'h'] # 生成新列,right=False设置区间左闭右开,匹配需求 df['new_colum'] = pd.cut(df['days'], bins=bins, labels=labels, right=False)
right=False让区间变为[-inf,180)、[180,365)、[365, inf),正好对应我们的条件逻辑。
内容的提问来源于stack exchange,提问作者vidathri
相关产品推荐
相关产品推荐

