我有两个这样的数据框:
保证金:
margins = pd.DataFrame([{'balance_date': '2019-06-24', 'opp_pty_cd': 'GOODM','cur': 'KRW', 'amt':9714190.0,'acct': 30}, {'balance_date': '2019-06-24', 'opp_pty_cd': 'KIS','cur': 'KRW', 'amt':1858386321.,'acct': 30}])
费率:
dict={'CME':{u'JPY': 0.525, u'USD': 3.305, u'CNH': 4.805},
'EUREX':{u'USD': 3.305, u'GBP': 1.545, u'EUR': 0.375},
'GOODM':{u'KRW': 0.0},
'HKEX':{u'USD': 3.395, u'HKD': 3.565, u'CNH': 4.895},
'KIS':{u'KRW': 0.0},
'NLFX':{u'USD': 3.305},
'OSE':{u'JPY': 0.615},
'SGX':{u'JPY': 0.725, u'USD': 2.605, u'SGD': 2.575, u'CNH': 5.005, u'CNY': 0.0},
'TOCN':{u'JPY': 0.525}}
rate=pd.DataFrame.from_dict(dict)
我需要将两个数据帧相乘,因此需要将空白处的amt与正确的opp_pty_cd和cur相乘。
当我尝试这样做时:
margins['amt'] = margins['amt']* rate[margins['opp_pty_cd']][KIS_margins['cur']]
我收到此错误:
KeyError: "[u'KRW' u'KRW'] not in index"
答案 0 :(得分:1)
我认为您首先需要DataFrame.reindex
来添加缺少的索引和列值(值是NaN
s,所以可以使用DataFrame.lookup
:
rate1 = rate.reindex(index=margins['cur'].unique(), columns=margins['opp_pty_cd'].unique())
margins['amt'] = margins['amt'] * rate1.lookup(margins['cur'], margins['opp_pty_cd'])
print (margins)
acct amt balance_date cur opp_pty_cd
0 30 0.0 2019-06-24 KRW GOODM
1 30 0.0 2019-06-24 KRW KIS
答案 1 :(得分:-1)
这不是直接的答案,但我希望它能对您有所帮助,因为当我想对DataFrames进行深度数学运算时,我会使用该选项:
Pandas基于Numpy,这非常酷,因为numpy受益于C来使瓶颈更快
df转换为np并相乘:
[输入]: 数据= [[3,3,3],[2,2,2],[1,1,1]] df = pd.DataFrame(data) 数组= df.values column_array = df [0] .values
打印(数组) [[3 3 3] [2 2 2] [1 1 1]]
print(类型(数组))
print(column_array) [3 2 1]
print(type(column_array))
现在,您不仅可以乘法,而且可以受益于所有Numpy功能
我认为@jezrael的回答很好。您的代码还可以,但是您可能需要过滤数据以便能够将数字相乘。