我有2张照片:
框架1
Loc ----时间-代码-值
FRA ---- 2008 ---- F- ---- 1.224
CAN ---- 2007 ---- G ------ 1.99
MEX ---- 2010 ----- I ------- 3.55
frame2(多索引一)
国家------ Ccy ------- 2007 ------ 2008 ------ 2009
法国------欧元-------- 5.225 ------ 6.299 ------ 7.555
加拿大------加拿大--- 53.65 -------- 4.445 ----- 8.445
墨西哥------比索------ 15434.154 -------- 14564.3 ----- 4.455
我想将2007/2008 / ...的所有列都转换为欧元。
这意味着,如果Ccy是含铅的欧元,则应保留该货币,如果不从frame1检索汇率并更新其值。
我被困在这里,尝试了不同的方法,但没有令人满意的结果。
答案 0 :(得分:0)
考虑到多重索引,并使用合并方法来简化操作,以下代码:
frame2['Country'] = frame2.index.get_level_values(0)
frame2['Loc'] = frame2.index.get_level_values(0).str[0:3]
frame2['Ccy'] = frame2.index.get_level_values(1)
merged = frame1.merge(frame2)
merged.loc[merged.Ccy != 'EURO', ['2007', '2008', '2009']] = merged.loc[merged.Ccy != 'EURO', ['2007', '2008', '2009']].values * merged.loc[merged.Ccy != 'EURO', ['Value']].values
merged.loc[merged.Ccy != 'EURO', 'Ccy'] = 'EURO'
frame2 = merged[['Country','Ccy','2007','2008','2009']]
frame2.set_index(['Country', 'Ccy'], inplace = True)
产生所需的输出:
编辑:现在还使用新币种更新了Ccy列。