You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 18:36:05