【问题标题】:Operation on multiple mapped currency columns using pandas使用 pandas 对多个映射货币列进行操作
【发布时间】:2019-11-11 13:56:26
【问题描述】:

我有两个数据框,即 df1 和 df2。我想对 df2 中的“Amount_Dollar”列执行操作。基本上在 df1 中,我有历史货币数据,我想对 df2 中的 Currency 和 Amount_Dollar 执行按日期操作,以计算 df2 中 New_Amount_Dollar 列的值。

对于 'Currency' == [AUD, BWP] 我们需要将 Amount_Dollar 乘以相应日期的相应货币值。

如果 df1 中没有任何货币,则不要对“Amount_Dollar”执行任何操作(表示取相同的值)

对于其他可用货币,我们需要将 Amount_Dollar 除以相应日期的相应货币值。

例如,在 df2 中,我的第一个货币为澳元,日期 = '01-01-2019',所以我想计算 New_Amount_Dollar 值这样

New_Amount_Dollar = 来自 df1 的 Amount_Dollar*AUD 值,即 New_Amount_Dollar = 19298*98 = 1891204

另一个例子,在 df2 中我有第三种货币作为日期 = '03-01-2019 的 COP,所以我想计算 New_Amount_Dollar 值这样

New_Amount_Dollar = 来自 df1 的 Amount_Dollar/COP 值,即 New_Amount_Dollar = 5000/0.043 = 116279.06

import pandas as pd
data1 = {'Date':['01-01-2019', '02-01-2019', '03-01-2019', 
                 '04-01-2019','05-01-2019'],
        'AUD':[98, 98.5, 99, 99.5, 97],
        'BWP':[30, 31, 33, 32, 31],
        'CAD':[0.02, 0.0192, 0.0196, 0.0196, 0.0192],
        'BND':[0.99, 0.952, 0.970, 0.980, 0.970],
        'COP':[0.05, 0.047, 0.043, 0.047, 0.045]}
df1 = pd.DataFrame(data1)

data2 = {'Date':['01-01-2019', '02-01-2019', '03-01-2019', '04-01-2019','05-01-2019'],
        'Currency':['AUD','AUD','COP','NZD','BND'],
        'Amount_Dollar':[19298, 19210, 5000, 200, 2300],
        'New_Amount_Dollar':[0,0,0,0,0]
        }
df2 = pd.DataFrame(data2) 

df1

         Date    AUD  BWP     CAD    BND    COP
0  01-01-2019   98.0   30  0.0200  0.990  0.050
1  03-01-2019   98.5   31  0.0192  0.952  0.047
2  04-01-2019   99.0   33  0.0196  0.970  0.043
3  05-01-2019   99.5   32  0.0196  0.980  0.047
4  06-01-2019   97.0   31  0.0192  0.970  0.045
5  09-01-2019  100.0   20  0.2000  0.230  0.023

df2

         Date Currency  Amount_Dollar  New_Amount_Dollar
0  01-01-2019      AUD          19298                  0
1  02-01-2019      AUD          19210                  0
2  03-01-2019      COP           5000                  0
3  04-01-2019      NZD            200                  0
4  07-01-2019      BND           2300                  0

预期结果

         Date Currency  Amount_Dollar  New_Amount_Dollar
0  01-01-2019      AUD          19298         1891204.00
1  02-01-2019      AUD          19210         1892185.00
2  03-01-2019      COP           5000          116279.06
3  04-01-2019      NZD            200             200.00
4  05-01-2019      BND           2300            2371.13

【问题讨论】:

  • 为什么CAD 还是200,有一种货币可用。我希望200 / 0.0196
  • 对不起,这是我的错。请立即检查。

标签: python pandas


【解决方案1】:

首先unstack df1得到所有FX的列,稍后将用于join:

df1.set_index('Date', inplace=True)
df1 = pd.DataFrame(df1.unstack(), columns = ['FX'])

然后加入 df2。为 CAD 和 BWP 添加蒙版,取 CAD/BWP 的倒数。然后进行逐列操作以获得新的数量。

df2 = df2.merge(df1, left_on = ['Currency', 'Date'], right_index = True, how = 'left').fillna(1)
df2['mask'] = df2['Currency'].isin(['AUD', 'BWP'])
df2.loc[df2['mask'], 'FX'] = 1/df2.loc[df2['mask'], 'FX']
df2['New_Amount_Dollar'] = df2['Amount_Dollar'] / df2['FX']

【讨论】:

    【解决方案2】:

    看到CAD 是唯一不会改变其价值的货币,我猜您正在尝试将货币转换为CAD。但是,df1 的加元汇率似乎有点古怪。

    总之,代码如下:

    # Format the data in `df1` to have the same general shape as `df2`
    fx = pd.melt(df1, id_vars='Date', var_name='Currency', value_name='Rate')
    
    # Exclude certain currencies from the conversion
    exclude = ['CAD']
    fx = fx[~fx.isin(exclude)]
    
    # Some rates we multiply, some rates we divide
    # Here, we convert the rate so the next step only involves multiplication
    divide = ['COP']
    fx['Rate'] = np.where(fx['Currency'].isin(divide), 1 / fx['Rate'], fx['Rate'])
    
    # Perform the actual conversion
    df2.merge(fx, how='left', on=['Date', 'Currency']) \
        .assign(New_Amount_Dollar=lambda df: df['Amount_Dollar'] * df['Rate'].fillna(1)) \
        .drop(columns='Rate')
    

    【讨论】:

    • 它不应该被硬编码,因为我不知道哪种货币不存在,除非我检查它。它应该动态检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-12
    • 2017-11-20
    • 2020-02-25
    • 2012-06-22
    • 1970-01-01
    • 2015-10-31
    • 2020-08-20
    相关资源
    最近更新 更多