Python如何基于多列规则生成新列Sponsor
解决DataFrame新增Sponsor列的问题
需求与现有数据
需要给DataFrame新增一列Sponsor,值的生成规则如下:
- 当
Program为"A"或"B",且Source列包含"Global"时,取值为Owner列的内容 - 其余情况取值为
Source列的内容
现有原始数据:
Program Source Region Owner A Global ECAN Girl B Regional US Boy C Delta Global EMEA Girl
原代码存在的问题
你写的代码有几个明显错误:
- Python字符串没有
contains方法,判断子串是否存在应该用'Global' in row['Source'] - 逻辑运算符使用错误:Python里逻辑与/或要用
and/or,&/|是位运算符,不适合这里的逻辑判断 - 逻辑优先级错误:原代码未给
(row['Program'] == 'A') | (row['Program'] == 'B')加括号,会导致逻辑判断顺序出错,应该先判断Program是否为A或B,再和Source的条件做与运算 - 代码格式错误:
else块的return语句没有缩进,不符合Python语法规范
修正后的代码方案
方案1:修正原有apply方法
针对原代码的错误逐一修正:
def SetSponsor(row): if (row['Program'] == 'A' or row['Program'] == 'B') and 'Global' in row['Source']: return row['Owner'] else: return row['Source'] df['Sponsor'] = df.apply(SetSponsor, axis=1)
方案2:矢量化操作(推荐)
逐行apply的效率较低,推荐用pandas和numpy的矢量化方法实现,运行速度更快:
import numpy as np # 构建符合规则的布尔条件 condition = df['Program'].isin(['A', 'B']) & df['Source'].str.contains('Global') # 根据条件赋值 df['Sponsor'] = np.where(condition, df['Owner'], df['Source'])
最终结果
运行上述代码后,DataFrame会新增Sponsor列,结果如下:
Program Source Region Owner Sponsor A Global ECAN Girl Girl B Regional US Boy Regional C Delta Global EMEA Girl Delta Global
内容的提问来源于stack exchange,提问作者Ziggy
相关产品推荐
相关产品推荐

