我正在尝试将数据框中的某些值转换为美元。因此,我有一个用于货币换算的数据框,另一个是数据。
货币数据框:
Identifier Price
USDJPY 110.42
USDHKD 7.8483
USDCNH 6.7837
USDUSD 1.0
数据如下:
date acct type currency isM pbc spanReq exchange
20190215 20 S JPY INIT CORE 14872000.0 SGX
20190215 40 S USD INIT CORE 2987340.93 SGX
20190215 60 S USD INIT CORE 2030260.39 SGX
20190215 70 S JPY INIT CORE 57172391.0 SGX
20190215 20 S JPY INIT CORE 106516141.0 OSE
20190215 70 S JPY INIT CORE 1800000.0 OSE
20190215 10 S CNH INIT CORE 0.0 HKEX
20190215 40 S HKD INIT CORE 36071131.4 HKEX
20190215 60 S HKD INIT CORE 3459377.95 HKEX
20190215 70 S HKD INIT CORE 81300.0 HKEX
20190215 80 S HKD INIT CORE 23698214.0 HKEX
20190215 10 S USD INIT CORE 1728005.0 CME
20190215 20 S USD INIT CORE 83671.0 CME
20190215 30 S USD INIT CORE 6237.0 CME
20190215 40 S USD INIT CORE 857120.0 CME
20190215 60 S USD INIT CORE 2803385.0 CME
20190215 70 S USD INIT CORE 9007666.0 CME
20190215 90 S USD INIT CORE 119644.0 CME
预期输出:
date acct type currency isM pbc spanReq exchange
20190215 20 S JPY INIT CORE 134551.70541934317 SGX
20190215 40 S USD INIT CORE 2987340.93 SGX
20190215 60 S USD INIT CORE 2030260.39 SGX
20190215 70 S JPY INIT CORE 517256.77191712655 SGX
20190215 10 S CNH INIT CORE 0.0 HKEX
20190215 40 S HKD INIT CORE 4624504.025641026 HKEX
20190215 60 S HKD INIT CORE 443509.9935897436 HKEX
20190215 70 S HKD INIT CORE 10423.076923076924 HKEX
20190215 80 S HKD INIT CORE 3038232.564102564 HKEX
20190215 20 S JPY INIT CORE 963685.343345698 OSE
20190215 70 S JPY INIT CORE 16285.171446666063 OSE
20190215 10 S USD INIT CORE 1728005.0 CME
20190215 20 S USD INIT CORE 83671.0 CME
20190215 30 S USD INIT CORE 6237.0 CME
20190215 40 S USD INIT CORE 857120.0 CME
20190215 60 S USD INIT CORE 2803385.0 CME
20190215 70 S USD INIT CORE 9007666.0 CME
20190215 90 S USD INIT CORE 119644.0 CME
我的代码如下:
initial_margin_data['spanReq'] = initial_margin_data['spanReq'].astype(float)/d.loc[d['Identifier'] == initial_margin_data['currency'], 'Price']
第二行给我这个错误:
Can only compare identically-labeled Series objects
对此需要一些指导。
答案 0 :(得分:2)
您可以像这样初始化货币映射,
m = dict(zip(currency['Identifier'].str[-3:], currency['Price']))
m
# {'CNH': 6.7837, 'HKD': 7.8483, 'JPY': 110.42, 'USD': 1.0}
现在,您可以将货币映射到汇率并除以:
df['spanReq'] /= df['currency'].map(m)
答案 1 :(得分:0)
这部分代码将无法执行您认为将要执行的操作。
d.loc[d['Identifier'] == initial_margin_data['currency'], 'Price']
由于“ ==”的两面都是序列,因此尝试比较它们是否相等。而且不能。您希望 initial_margin_data ['currency'] 将为您提供给定行的货币类型。您可能需要做的是某种形式的申请。将 d 实际用作查找字典可能会更容易。
我用一个玩具示例模拟了一些代码,这可能会更好地解释
。import pandas as pd
d = {'A': 1, 'B' : 2}
df = pd.DataFrame([[20, "A"],[30,"B"]])
df.apply(lambda x: x[0] / d[x[1]], axis=1)
#results
0 20.0
1 15.0
dtype: float64
我正在使用apply遍历每一行(因为axis = 1),并将每一行传递给lambda函数。在我的情况下,我使用0索引并获取帐户值,使用1索引并获取字母(代表您的标识符)。然后,我用它在字典“ d”中查找“价格”。然后,我做您想做的数学运算。
您还可以按名称索引这些列,我的玩具示例根本没有列名。
您也可能会发现此函数可用于创建字典pandas.DataFrame.to_dict