如何在Pandas中根据ID是否在指定列表生成新列LT?
高效实现LT列的创建(替代iterrows循环)
嘿,我来帮你搞定这个数据处理需求!用iterrows逐行循环确实不是最优做法——Pandas提供了更简洁、性能更好的向量式操作来完成这个逻辑,完全不用逐行遍历。
先明确你的需求:
- 现有DataFrame
org,包含ID列 - 列表
ltlist = [1,2,3,4,5] - 新建
LT列:若ID值在ltlist中,则取对应ID值;否则赋值为0
方法一:用numpy.where(最直观的向量式操作)
一行代码就能搞定,逻辑清晰又高效:
import pandas as pd import numpy as np # 初始化你的数据 org = pd.DataFrame({'ID': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}) ltlist = [1, 2, 3, 4, 5] # 创建LT列 org['LT'] = np.where(org['ID'].isin(ltlist), org['ID'], 0)
解释:
org['ID'].isin(ltlist)会生成一个布尔序列,标记每个ID是否在目标列表中np.where()根据这个布尔序列选择取值:满足条件时取ID值,不满足时取0
方法二:Pandas条件赋值(分步操作,逻辑更直白)
如果你更喜欢分步拆解操作,也可以这样写:
# 先把LT列初始化为ID的值 org['LT'] = org['ID'] # 把不在ltlist中的ID对应的LT值设为0 org.loc[~org['ID'].isin(ltlist), 'LT'] = 0
解释:
~符号用来对布尔序列取反,~org['ID'].isin(ltlist)就是“ID不在ltlist中”的条件loc用来精准定位满足条件的行,直接修改LT列的对应值
为什么不推荐用iterrows?
iterrows是逐行遍历DataFrame,当数据量较大时,这种方法的性能会差得离谱——向量式操作是Pandas的核心优势,它在底层用C语言实现计算,速度比逐行循环快几个数量级。
内容的提问来源于stack exchange,提问作者Tim Scongack
相关产品推荐
相关产品推荐

