我对这个问题感到很疯狂。我正在尝试根据在另一个数据框 DF2 中找到的值将新列添加到数据框 DF1 。这就是他们的样子,
DF1 =
Date Amount Currency
0 2014-08-20 -20000000 EUR
1 2014-08-20 -12000000 CAD
2 2014-08-21 10000 EUR
3 2014-08-21 20000 USD
4 2014-08-22 25000 USD
DF2 =
NAME OPEN
0 EUR 10
1 CAD 20
2 USD 30
现在,我想在 DF1 中创建一个新列,名为'Amount(Local)',其中'Amount'中的每个金额与 DF2 中找到的正确匹配值相乘,产生结果,
DF1 =
Date Amount Currency Amount (Local)
0 2014-08-20 -20000000 EUR -200000000
1 2014-08-20 -12000000 CAD -240000000
2 2014-08-21 10000 EUR 100000
3 2014-08-21 20000 USD 600000
4 2014-08-22 25000 USD 750000
如果存在一种基于函数向 DF1 添加列的方法,而不仅仅是乘法作为上述问题,那么也非常感激。
谢谢,
答案 0 :(得分:2)
您可以使用第二个df的dict中的map
(在我的情况下,它被称为df1。你的是DF2),然后将其结果乘以金额:
In [65]:
df['Amount (Local)'] = df['Currency'].map(dict(df1[['NAME','OPEN']].values)) * df['Amount']
df
Out[65]:
Date Amount Currency Amount (Local)
index
0 2014-08-20 -20000000 EUR -200000000
1 2014-08-20 -12000000 CAD -240000000
2 2014-08-21 10000 EUR 100000
3 2014-08-21 20000 USD 600000
4 2014-08-22 25000 USD 750000
所以打破这个,map
会将值与dict键中的值匹配,在这种情况下,我们将Currency
与NAME
键匹配,dict中的值是OPEN
值,结果如下:
In [66]:
df['Currency'].map(dict(df1[['NAME','OPEN']].values))
Out[66]:
index
0 10
1 20
2 10
3 30
4 30
Name: Currency, dtype: int64
然后,我们只需将此系列与Amount
中的df
列相乘(在您的情况下为DF1),以获得所需的结果。
答案 1 :(得分:1)
使用花式索引创建与df1
中的数据对齐的货币数组,然后在乘法中使用它,并将结果分配到df1
中的新列:
import pandas as pd
ccy_series = pd.Series([10,20,30], index=['EUR', 'CAD', 'USD'])
df1 = pd.DataFrame({'amount': [-200, -120, 1, 2, 2.5], 'ccy': ['EUR', 'CAD', 'EUR', 'USD', 'USD']})
aligned_ccy = ccy_series[df1.ccy].reset_index(drop=True)
aligned_ccy
=>
0 10
1 20
2 10
3 30
4 30
dtype: int64
df1['amount_local'] = df1.amount *aligned_ccy
df1
=>
amount ccy amount_local
0 -200.0 EUR -2000
1 -120.0 CAD -2400
2 1.0 EUR 10
3 2.0 USD 60
4 2.5 USD 75