匹配并向数据框添加列

时间:2014-08-22 07:01:25

标签: python pandas

我对这个问题感到很疯狂。我正在尝试根据在另一个数据框 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 添加列的方法,而不仅仅是乘法作为上述问题,那么也非常感激。

谢谢,

2 个答案:

答案 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键中的值匹配,在这种情况下,我们将CurrencyNAME键匹配,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