【问题标题】:Loop through rows of df and perform calculations based on if-statement遍历 df 行并根据 if 语句执行计算
【发布时间】:2021-04-02 10:50:29
【问题描述】:

我正在尝试以多种货币将我的经纪费用计算为美元。因此,如果我以欧元支付费用,则费用应乘以当天的欧元/美元汇率。

示例数据框:

import pandas as pd
df = pd.DataFrame({"Fee Coin": ["EUR", "BTC"],
                   "Fee": [3, 0.0005],
                    "USD Price": [1.05, 1.1],
                     "BTC Price": [24000, 27000]})

第一行的输出应该是3.15,第二行应该是13.5。输出应显示在我尝试调用 Fee in USD 的新列中。

我尝试过的,给出了错误的计算:

for value in df["Fee Coin"]:
    if value == "EUR":
        df["Fee in USD"] = df.Fee*df["USD Price"]
    elif value == "BTC":
        df["Fee in USD"] = df.Fee*df["BTC Price"]

【问题讨论】:

    标签: python pandas for-loop if-statement


    【解决方案1】:

    由于您只有两个类别:EUR 和 BTC,因此您可以使用 np.where。

    df["Fee in USD"] = np.where(df["Fee Coin"] == "EUR", df.Fee * df["USD Price"], 
                                 df.Fee * df["BTC Price"])
    

    输出:

       Fee Coin     Fee  USD Price  BTC Price  Fee in USD
    0      EUR  3.0000       1.05      24000        3.15
    1      BTC  0.0005       1.10      27000       13.50
    

    更新: 对于多种货币,最好有一个从费用硬币到列名的映射,即

    currency_to_col = {"EUR": "USD Price", "BTC": "BTC Price", "JPY": "JPY Price"}.
    

    然后使用 np.select

    condlist = [df["Fee Coin"] == currency for currency in df["Fee Coin"].unique()]
    choicelist = [df.Fee * df[currency_to_col[currency]] for currency in df["Fee Coin"].unique()]
    df["Fee in USD"] = np.select(condlist, choicelist)
    

    数据帧:

      Fee Coin     Fee  USD Price  BTC Price  JPY Price
    0      EUR  3.0000       1.05      24000       1000
    1      BTC  0.0005       1.10      27000       2000
    2      JPY  0.2000       1.20      29000       3000
    

    输出:

      Fee Coin     Fee  USD Price  BTC Price  JPY Price  Fee in USD
    0      EUR  3.0000       1.05      24000       1000        3.15
    1      BTC  0.0005       1.10      27000       2000       13.50
    2      JPY  0.2000       1.20      29000       3000      600.00
    

    【讨论】:

    • 这不适用于三种或更多货币,对吧?
    • 没有。为此,请使用@Andrej 代码。
    • 检查 np.select。如果需要,我可以更新答案。
    • 那个很整洁,阿米特。我确实有几种货币,np.select 很好地解决了这个问题。为了遵循我最初的 df,我是如何使用它的:df["Fee in USD"] = np.select([df["Fee Coin"] == "EUR", df["Fee Coin"] == "BTC"], [df.Fee * df["USD Price"], df.Fee * df["BTC Price"]])
    • 我认为最好将货币类型映射到相应的列名,即currency_to_col = {"EUR": "USD Price", "BTC": "BTC Price", "JPY ": JPY Price"}。然后我们就可以轻松地构造condlist和choicelist了。
    【解决方案2】:
    m_eur = df["Fee Coin"] == "EUR"
    m_btc = df["Fee Coin"] == "BTC"
    
    df["Fee in USD"] = pd.concat(
        [
            df.loc[m_eur, "Fee"] * df.loc[m_eur, "USD Price"],
            df.loc[m_btc, "Fee"] * df.loc[m_btc, "BTC Price"],
        ]
    )
    
    print(df)
    

    打印:

      Fee Coin     Fee  USD Price  BTC Price  Fee in USD
    0      EUR  3.0000       1.05      24000        3.15
    1      BTC  0.0005       1.10      27000       13.50
    

    【讨论】:

      【解决方案3】:

      您得到错误计算的原因是因为您将每一行乘以整个 df['Fee'] column with df['USD Price'] or df['BTC Price']。基本基于 在最后一行的费用硬币值上,您的费用列被 USD/BTC 价格列相乘。

      在您的情况下,由于最后一行包含“BTC”硬币,因此它乘以 BTC 价格,结果如下:

         Fee Coin  Fee     USD Price  BTC Price  Fee in USD
      0  EUR       3       1.05       24000      72000
      1  BTC       0.0005  1.1        27000      13.5
      

      所以,基本上你应该乘以特定的行值而不是乘以整列

      for i in range(len(df)):
          if df.loc[i, "Fee Coin"] == "EUR":
              df.loc[i,"Fee in USD"] = df.loc[i,"Fee"]*df.loc[i,"USD Price"]
          elif df.loc[i, "Fee Coin"] == "BTC":
              df.loc[i,"Fee in USD"] = df.loc[i,"Fee"]*df.loc[i,"BTC Price"]
      

      最终数据框:

         Fee Coin  Fee     USD Price  BTC Price  Fee in USD
      0  EUR       3       1.05       24000      3.15
      1  BTC       0.0005  1.1        27000      13.50
      
      

      P.S.对于三种或更多货币,您可以在条件 If-Else 块中添加条件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-01
        • 1970-01-01
        • 2022-11-23
        • 2021-11-28
        • 1970-01-01
        • 2014-02-06
        相关资源
        最近更新 更多