如何在Pandas中对额外列迭代执行向量化if/else语句?
解决方案
这里有两种简洁的实现方式,都能精准满足你的需求——优先保留ID列匹配ltlist的非0值,仅当LT列初始为0时,才检查ID2列并填入符合条件的值:
方法1:分步更新(可读性更强)
先基于ID列初始化LT列,再针对LT为0的行进行二次判断,逻辑清晰易懂:
import pandas as pd, numpy as np ltlist = [1, 2] org = {'ID': [1, 3, 4, 5, 6, 7], 'ID2': [3, 4, 5, 6, 7, 2]} df = pd.DataFrame(org) # 先转成DataFrame方便操作 ltlist_set = set(ltlist) # 第一步:用ID列初始化LT列,匹配则填ID,否则填0 df['LT'] = np.where(df['ID'].isin(ltlist_set), df['ID'], 0) # 第二步:对LT为0的行,检查ID2是否在集合中,符合则替换为ID2的值 update_mask = (df['LT'] == 0) & df['ID2'].isin(ltlist_set) df.loc[update_mask, 'LT'] = df.loc[update_mask, 'ID2'] print(df)
方法2:嵌套np.where(一行式)
如果你偏好更紧凑的写法,可以用嵌套的np.where直接完成多层逻辑判断:
import pandas as pd, numpy as np ltlist = [1, 2] org = {'ID': [1, 3, 4, 5, 6, 7], 'ID2': [3, 4, 5, 6, 7, 2]} df = pd.DataFrame(org) ltlist_set = set(ltlist) df['LT'] = np.where( df['ID'].isin(ltlist_set), # 优先判断ID列 df['ID'], # ID不匹配时,判断ID2列,匹配则填ID2,否则填0 np.where(df['ID2'].isin(ltlist_set), df['ID2'], 0) ) print(df)
输出结果
两种方法都会得到你期望的输出:
ID ID2 LT 0 1 3 1 1 3 4 0 2 4 5 0 3 5 6 0 4 6 7 0 5 7 2 2
核心逻辑说明
- 优先级明确:只要
ID在ltlist集合中,LT就直接取ID的值,不会被后续逻辑覆盖 - 兜底判断:仅当
ID不匹配(即LT初始为0)时,才检查ID2列;如果ID2符合条件则替换LT值,否则保持0
内容的提问来源于stack exchange,提问作者Tim Scongack
相关产品推荐
相关产品推荐

