Dateframe1
df = pd.DataFrame(SQL_Query, columns=[ X,Y . . . . Currency,Amount]
Index X Y ... Currency Amount
0 74 1 ... USD 100
1 75 1 ... EUR 5000
2 76 1 ... AUD 300
3 79 1 ... EUR 750
[1411137 rows x 162 columns]
大型SQL查询,因此避免写出所有列。
df1=pd.read_excel(r`FX_EUR.xlsx)
Index Currency FX
0 AUD 1.61350
1 BGN 1.95580
2 BRL 4.51450
3 CAD 1.45830
4 CHF 1.09280
因此,我想实现的是在DF1中进行查找,以确定使用哪种货币,然后将“ DF1金额”列与“ DF2 FX”列相除,然后对DF1中的所有行进行除法。通过制作第三个DF3或创建一个名为Amount_EUR的新列DF1。
关于如何编写此代码的任何想法?
您可以使用map
来应用变换-
import pandas as pd
df = pd.DataFrame({"Currency": ['USD', 'EUR', 'AUD', 'EUR'], "Amount": [100, 5000, 300, 750]})
df1 = pd.DataFrame({"Currency": ["AUD", "BGN", "BRL", "CAD", "EUR"], "FX": [1.6, 1.9, 4.5, 1.5, 1.1]})
df1 = df1.set_index("Currency")
df['FX'] = df['Currency'].map(df1.FX)
df['FX_Adj_Amt'] = df['Amount'].div(df['FX'])
df
# Currency Amount Fx FX_Adj_Amt
#0 USD 100 NaN NaN
#1 EUR 5000 1.1 4545.454545
#2 AUD 300 1.6 187.500000
#3 EUR 750 1.1 681.818182
您可以使用merge来建立一个包含与FX
相同索引的正确Currency
(相同df
)的系列。这样,该划分就变得微不足道了:
fx = df.merge(df1, 'left', on='Currency')['FX']
df.loc[~ fx.isna(),'EUR_Amount'] = df.loc[~ fx.isna()]['Amount']/fx.loc[~ fx.isna()]
使用示例数据,它给出:
X Y ... Currency Amount EUR_Amount
Index
0 74 1 ... USD 100 NaN
1 75 1 ... EUR 5000 NaN
2 76 1 ... AUD 300 185.931205
3 79 1 ... EUR 750 NaN