You need to enable JavaScript to run this app. 如何通过Pandas遍历DataFrame行结合条件判断计算多币种佣金USD值
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Pandas遍历DataFrame行结合条件判断计算多币种佣金USD值

代码问题定位
  • 原代码的核心逻辑错误:循环遍历每一个「Fee Coin」取值时,每次条件命中都会给整个DataFrame的「Fee in USD」列做全量赋值,而非对匹配条件的行单独计算。两次循环的赋值结果会互相覆盖:
    1. 第一次循环取到EUR值时,计算全列的Fee * USD Price得到[3.15, 0.00055],将整列值赋给新列
    2. 第二次循环取到BTC值时,计算全列的Fee * BTC Price得到[72000, 13.5],直接覆盖之前整列的结果,最终输出完全不符合预期。
  • 此外无意义的逐行遍历赋值效率极低,pandas提供的向量化操作可以在不遍历行的前提下完成逐行匹配计算。
修正方案

方案1:向量化条件计算(推荐,效率最高)

借助numpy的条件判断函数逐行匹配币种规则,无需手动写循环:

import numpy as np
# 逐行匹配币种,计算对应美元折算值
df["Fee in USD"] = np.where(
    df["Fee Coin"] == "EUR",
    df["Fee"] * df["USD Price"],
    np.where(
        df["Fee Coin"] == "BTC",
        df["Fee"] * df["BTC Price"],
        np.nan
    )
)

如果后续涉及更多计价币种,嵌套条件的可读性会下降,可以改用更清晰的批量规则匹配写法:

# 定义匹配规则
match_conditions = [
    df["Fee Coin"] == "EUR",
    df["Fee Coin"] == "BTC"
]
calc_rules = [
    df["Fee"] * df["USD Price"],
    df["Fee"] * df["BTC Price"]
]
# 未匹配到规则的币种默认留空
df["Fee in USD"] = np.select(match_conditions, calc_rules, default=np.nan)

运行代码后即可得到预期结果:第一行值为3.15,第二行值为13.5。

方案2:逐行遍历的修正写法

如果确实需要逐行遍历完成计算,需要调整赋值逻辑为按行索引定位,避免全列覆盖:

# 先初始化新列,避免计算过程中出现空值
df["Fee in USD"] = 0.0
for idx, row in df.iterrows():
    if row["Fee Coin"] == "EUR":
        # 仅对当前遍历到的行赋值
        df.loc[idx, "Fee in USD"] = row["Fee"] * row["USD Price"]
    elif row["Fee Coin"] == "BTC":
        df.loc[idx, "Fee in USD"] = row["Fee"] * row["BTC Price"]

该写法仅适合小数据量场景,数据量较大时性能远低于向量化计算方法。

补充说明:当前示例中的「USD Price」列,对EUR行来说存储的是EUR/USD即期汇率,对非EUR计价的行来说不参与计算,和实际券商佣金折算的逻辑完全匹配。

内容的提问来源于stack exchange,提问作者HobbyCoder11

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 19:06:04