我有一个带有两个列的数据框:
df:
ix Col1 Col2
1 11.0 'JPY'
2 51.0 'EUR'
..
1000,000 27.0 'CAD'
我有货币清单l1 = ['JPY','EUR',...,'CAD']
我有转换列表l2 = [5.0, 1.0, ..., 0.5]
我也有我创建的功能:
def convert_currency(symbol, amount):
index_value = list_of_symbols.index(symbol)
rate = list_of_values[index_value]
converted = amount * rate
return converted
,我想应用此功能如下:
for index, row in df.iterrows():
if row['currency'] != 'GBP':
row['price_inc'] = convert_currency(row['currency'], row['price_inc'])
但行不通。
基于COL2值将功能应用于COL1值的快速工作解决方案,该功能会摄入COL1值和返回值,以取代Col1值
iiuc您可以使用以下矢量化方法:
源数据集:
In [108]: d1
Out[108]:
ix Col1 Col2
0 1 11.0 JPY
1 2 51.0 EUR
2 3 27.0 CAD
In [109]: l1 = ['JPY','EUR','CAD']
In [110]: l2 = [5.0, 1.0, 0.5]
助手"汇率"系列:
In [111]: d2 = pd.Series(l2, l1)
In [112]: d2
Out[112]:
JPY 5.0
EUR 1.0
CAD 0.5
dtype: float64
解决方案:
In [113]: d1.Col1 *= d1.Col2.map(d2)
In [114]: d1
Out[114]:
ix Col1 Col2
0 1 55.0 JPY
1 2 51.0 EUR
2 3 13.5 CAD
我不确定我是否完全理解,但是您似乎想将Col1乘以一定的速率,对于不同的Col2值而言,这是不同的。我建议通过使用"应用"功能创建一个名为'RATE'的新列来执行此操作,这是每个Col2行的相应速率。然后,将Col1乘以"速率"是解决方案。这是一些工作代码。我选择在字典中存储col2和速率之间的映射(而在两个列表中进行),但是这个想法是相同的。
df=pd.DataFrame([[11.0,'JPY'],[51.0,'EUR'],[27.0,'CAD']],columns=['Col1','Col2'])
mydict = {'JPY':5.0,'EUR':1.0,'CAD':0.5}
def get_rate(symbol):
return mydict[symbol]
df['rate'] = df['Col2'].apply(get_rate)
df['price_inc'] = df['Col1'] * df['rate']
Out[87]:
Col1 Col2 rate price_inc
0 11.0 JPY 5.0 55.0
1 51.0 EUR 1.0 51.0
2 27.0 CAD 0.5 13.5