根据另一个数据框的值创建一列

时间:2020-06-26 08:57:21

标签: pandas dataframe

我有第一个数据帧df:

                       cur_cost_id   cur_sales_id  product_description
date_facture                                                      
2020-01-01 00:20:09            2             1                  io
2020-01-01 00:25:12            2             2                  io
2020-01-01 00:25:35            2             1                  io
2020-01-01 00:25:50            2             4                  io
2020-01-01 00:25:52            2             2                  io

使用以下有关汇率的其他数据框,我创建了平均平均值:

avg=df.mean(axis=1)

2020-05-27  2020-04-23  2020-06-12  2020-03-31  2020-03-30  2020-06-19  \
AUD    1.507142    1.570553    1.454972    1.639923    1.633225    1.450580   
BGN    1.779456    1.815633    1.730184    1.785141    1.772521    1.744692   
EUR    5.338823    5.446157    5.076787    5.202720    5.121533    5.354951   

我尝试在第一个数据帧中添加一列,以便如果cur_sales_id=1,则新列中的值为avg['EUR']

我尝试过这个:

def taux_change(row):
   if row['cur_sales_id'] == 1:
       val = avg['EUR']
   return val

df['Taux_change'] = df.apply(taux_change, axis=1)

但是我有这个错误:

(“分配前引用了局部变量'val','发生在 索引2020-01-01 00:20:09')

有人可以向我解释为什么?

2 个答案:

答案 0 :(得分:1)

def taux_change(row):
   if row['cur_sales_id'] == 1:
       val = avg['EUR']
   return val

df['Taux_change'] = df.apply(taux_change, axis=1)

您应该在行return val上加上一个制表符,因为它从函数中返回val。否则,它将像正常的代码流。

答案 1 :(得分:1)

在函数中,如果row['cur_sales_id'] != 1,则不会为val赋值。

编写函数的更好方法是

def taux_change(row):
    if row['cur_sales_id'] == 1:
        val = avg['EUR']
    else:
        val = None
    return val

df['Taux_change'] = df.apply(taux_change, axis=1)

另一种方法是:

df.loc[df['cur_sales_id'] == 1,'Taux_change'] = avg['EUR']

甚至更好的是使用map函数并创建平均汇率avg_xr_dict的字典,然后:

df["Taux_change"] = df["cur_sales_id"].map(avg_xr_dict)