【问题标题】:Matching and adding column to data frame将列匹配并添加到数据框
【发布时间】:2014-08-22 15:23:24
【问题描述】:

我要为这个发疯了。我正在尝试根据在另一个数据框 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' 中的每个金额 em> 与 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添加列的方法,而不是像上述问题那样仅仅乘法,那也将非常感激。

谢谢,

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以使用第二个 df 的字典中的 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
    

    然后,我们只需将该系列与来自df(在您的情况下为DF1)的Amount 列相乘即可获得所需的结果。

    【讨论】:

    • 感谢@EdChum!奇迹般有效。也感谢你的崩溃。我也尝试了@shx2 解决方案,它似乎在两个数据帧中的所有货币都相同的情况下才有效。在我的实际工作中,我的DF2 中确实有更多的货币代码,因此第二种解决方案更通用。给您带来的不便,我们深表歉意。
    【解决方案2】:

    使用花式索引创建与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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 2015-08-11
      • 2012-04-11
      • 2021-12-16
      • 2018-02-15
      • 2020-07-04
      • 1970-01-01
      相关资源
      最近更新 更多