python pandas DataFrame遍历行并比较两列并应用函数

时间:2017-09-14 21:45:53

标签: python function pandas dataframe apply

我有一个包含两列的DataFrame:

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值

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我不确定我是否完全理解,但似乎您希望将Col1乘以某种速率,这对于Col2的不同值是不同的。我建议使用" apply"用于创建名为' rate'的新列,这是每个Col2行的相应比率。然后,将Col1乘以' rate'是解决方案。这是一些有效的代码。我选择在字典中存储Col2和rate之间的映射(而你在两个列表中存储它),但是这个想法是相同的。

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