如何通过Pandas遍历DataFrame行结合条件判断计算多币种佣金USD值
代码问题定位
- 原代码的核心逻辑错误:循环遍历每一个「Fee Coin」取值时,每次条件命中都会给整个DataFrame的「Fee in USD」列做全量赋值,而非对匹配条件的行单独计算。两次循环的赋值结果会互相覆盖:
- 第一次循环取到
EUR值时,计算全列的Fee * USD Price得到[3.15, 0.00055],将整列值赋给新列 - 第二次循环取到
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
相关产品推荐
相关产品推荐

