Pandas:如何在Lambda中加入多条件生成符合要求的Past_Minute列
Pandas生成Past_Minute列的解决方案
原始数据与需求
给定如下Pandas DataFrame:
import pandas as pd df = pd.DataFrame({'Status':['Closed','Open', 'Open','Cancel','Closed','Cancel', 'Checkin', 'Open', 'Open', 'Checkin', 'Open'], 'DELTA_TIME':[-3, -1, 0, 5, 55, 40, 70, 80, 90, 100, 44]})
需要生成新列Past_Minute,规则如下:
- 当Status为
Open或Checkin且DELTA_TIME<30时,值为空; - 当Status为
Open或Checkin且30<DELTA_TIME<60时,值为'30 Mins Delay'; - 当Status为
Open或Checkin且60≤DELTA_TIME<90时,值为'60 Mins Delay'; - 当Status为
Open或Checkin且DELTA_TIME≥90时,值为'90 Mins Delay'; - 其他情况值为空。
问题分析
你尝试的两种方法存在以下问题:
- loc方法:运算符优先级错误,未用括号分组逻辑条件,导致判断逻辑失效;
- Lambda方法:未加入Status过滤条件,非
Open/Checkin的行被错误赋值。
正确实现方法
方法1:修正后的loc方法
核心是用括号将逻辑条件分组,避免运算符优先级冲突,先初始化空列再按规则赋值:
# 初始化新列为空字符串 df['Past_Minute'] = '' # 按规则依次匹配赋值 df.loc[(df['Status'].isin(['Open', 'Checkin'])) & (df['DELTA_TIME'] > 30) & (df['DELTA_TIME'] < 60), 'Past_Minute'] = '30 Mins Delay' df.loc[(df['Status'].isin(['Open', 'Checkin'])) & (df['DELTA_TIME'] >= 60) & (df['DELTA_TIME'] < 90), 'Past_Minute'] = '60 Mins Delay' df.loc[(df['Status'].isin(['Open', 'Checkin'])) & (df['DELTA_TIME'] >= 90), 'Past_Minute'] = '90 Mins Delay'
方法2:修正后的Lambda方法
在lambda函数中先判断Status是否符合要求,再进行时间区间判断,不符合直接返回空值:
df['Past_Minute'] = df.apply( lambda row: '' if row['Status'] not in ['Open', 'Checkin'] else '' if row['DELTA_TIME'] < 30 else '30 Mins Delay' if 30 < row['DELTA_TIME'] < 60 else '60 Mins Delay' if 60 <= row['DELTA_TIME'] < 90 else '90 Mins Delay', axis=1 )
方法3:高效简洁的pd.cut方法
利用pd.cut批量处理区间划分,再通过mask过滤非目标Status的行:
# 定义区间边界和对应标签 bins = [-float('inf'), 30, 60, 90, float('inf')] labels = ['', '30 Mins Delay', '60 Mins Delay', '90 Mins Delay'] # 生成初始区间值,再将非目标Status的行设为空 df['Past_Minute'] = pd.cut(df['DELTA_TIME'], bins=bins, labels=labels, include_lowest=True) df.loc[~df['Status'].isin(['Open', 'Checkin']), 'Past_Minute'] = ''
验证结果
执行上述任意方法后,打印DataFrame可得到符合要求的结果:
Status DELTA_TIME Past_Minute 0 Closed -3 1 Open -1 2 Open 0 3 Cancel 5 4 Closed 55 5 Cancel 40 6 Checkin 70 60 Mins Delay 7 Open 80 60 Mins Delay 8 Open 90 90 Mins Delay 9 Checkin 100 90 Mins Delay 10 Open 44 30 Mins Delay
内容的提问来源于stack exchange,提问作者Krishna
相关产品推荐
相关产品推荐

