Pandas中如何基于某列条件对另一列计算生成新列
核心结论
自定义逐行apply函数不是该需求的最佳实现方案,pandas原生矢量化运算或映射表方案的性能、可维护性都更高。
方案1:映射表实现(推荐,适合固定枚举的系数规则)
你需求里A的取值只到10,属于有限枚举,直接构造系数映射字典最直观,修改规则也只需调整字典:
import pandas as pd # 你的原始数据 df = pd.DataFrame([[1,1000],[2,1000],[3,1000]], columns=["A","B"]) # 构造A值到系数的映射,补全到A=10即可 rate_map = { 1: 0.8, 2: 0.1, 3: 0.05, 4: 0.025, 5: 0.0125, # 继续补充到A=10 } # 直接计算新列C df['C'] = df['B'] * df['A'].map(rate_map)
输出结果示例:
A B C 0 1 1000 800.00 1 2 1000 100.00 2 3 1000 50.00
方案2:矢量化公式实现(适合有规律的系数规则)
观察你的规则可发现A>=2时系数符合规律:系数 = 0.1 / 2^(A-2),直接用numpy的where做矢量化判断,性能最高,适合大数据量场景:
import numpy as np df['C'] = np.where( df['A'] == 1, df['B'] * 0.8, df['B'] * 0.1 / (2 ** (df['A'] - 2)) )
自定义函数的正确写法(不推荐,仅做参考)
你之前的函数问题在于没有同时接收A、B两列的值,如果一定要用自定义函数,需要按行传入整个行数据:
def calculation(row): if row['A'] == 1: return row['B'] * 0.8 elif row['A'] == 2: return row['B'] * 0.1 elif row['A'] == 3: return row['B'] * 0.05 # 继续补充剩下的A值判断逻辑 else: return 0 # 异常值兜底 # axis=1表示按行遍历 df['C'] = df.apply(calculation, axis=1)
注意:该逐行遍历方案在数据量大于1万条时,性能比前两种方案低10~100倍,仅建议逻辑极其复杂无法用矢量化实现时使用。
内容的提问来源于stack exchange,提问作者SOK
相关产品推荐
相关产品推荐

