只能比较标记相同的Series对象Pandas Python

时间:2019-02-19 01:57:19

标签: python pandas

我正在尝试将数据框中的某些值转换为美元。因此,我有一个用于货币换算的数据框,另一个是数据。

货币数据框:

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

对此需要一些指导。

2 个答案:

答案 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