循环遍历df的行,并根据IFF语句执行计算

2024-04-28 21:10:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图用几种货币将我的经纪费换算成美元。因此,如果我以欧元支付费用,费用应乘以该天的欧元/美元汇率

数据帧示例:

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。输出应显示在一个新的列中,我已尝试调用费用(美元)

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

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"]

Tags: 数据indfvalue货币eurpricepd
3条回答

因为您只有两个类别: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
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

计算错误的原因是,对于每一行,都要乘以整个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块中添加条件

相关问题 更多 >