Python 通过使用另一列中的值查找字典中的值,将新列添加到数据帧中

Python 通过使用另一列中的值查找字典中的值,将新列添加到数据帧中,python,numpy,pandas,ipython,Python,Numpy,Pandas,Ipython,如何将现有列乘以外部字典中的一个因子(使用与键相同的数据帧中第二列的值查找),从而将列添加到数据帧中 我有一个大致如下的pd.DataFrameDataFramedf code blah... year nominal 0 T.rrr blah... 2012-13 2.08 1 J.rrr blah... 2008-09 1.09 2 1320 blah... 2008-09 1.38 3

如何将现有列乘以外部字典中的一个因子(使用与键相同的数据帧中第二列的值查找),从而将列添加到数据帧中

我有一个大致如下的
pd.DataFrame
DataFrame
df

    code    blah...     year    nominal
0   T.rrr   blah...     2012-13     2.08
1   J.rrr   blah...     2008-09     1.09
2   1320    blah...     2008-09     1.38
3   1310    blah...     2010-11     1.20
4   1130    blah...     2010-11     1.22
我还将这些
因素作为字典:

factors = {'2008-09': 1.11075, '2010-11': 1.02947, '2012-13': 1.}
df['nominal'] * df['year'].map(factors)
我想通过将每个标称值乘以适当的因子来添加一列,我想使用数据框
df
中的第二列
df['year']
作为键,在外部
因子
字典中查找

df['real'] = df['nominal'] * factors[df['year']]

但这两者都会产生错误。我也试过类似的方法

def nominal_to_real(df, nom_col='nominal', year_col='year', factors=factors):
    return df[nom_col] * factors[df[year_col]]

df['real] = df.apply(nominal_to_real, axis=1)
这将产生以下错误

/Users/../anaconda/lib/python2.7/site packages/ipykernel/main.py:5: SettingWithCopyWarning:正在尝试在副本上设置值 从数据帧切片。尝试使用.loc[行索引器、列索引器]= 取而代之的是价值观

请参阅文档中的注意事项:

我做错了什么?当然这应该很简单


提前感谢

使用
映射
系列方法在字典中查找:

factors = {'2008-09': 1.11075, '2010-11': 1.02947, '2012-13': 1.}
df['nominal'] * df['year'].map(factors)

使用系列的
map
方法在字典中查找:

factors = {'2008-09': 1.11075, '2010-11': 1.02947, '2012-13': 1.}
df['nominal'] * df['year'].map(factors)

经过一些困惑,我可以确认这是如何做到这一点,与一个单一的行。这里的数据包含一列额外的单位;我正在过滤掉我不想使用的“比率”记录。关键是将
.loc
方法与
.map

df.loc[df.loc[:,'unit']!='Ratio','real'] = df.loc[df.loc[:,'unit']!='Ratio','nominal'] * df.loc[df.loc[:,'unit']!='Ratio','year'].map(factors)

经过一些困惑,我可以确认这是如何做到这一点,与一个单一的行。这里的数据包含一列额外的单位;我正在过滤掉我不想使用的“比率”记录。关键是将
.loc
方法与
.map

df.loc[df.loc[:,'unit']!='Ratio','real'] = df.loc[df.loc[:,'unit']!='Ratio','nominal'] * df.loc[df.loc[:,'unit']!='Ratio','year'].map(factors)

谢谢@brenbarn!您不知道如何将其存储到
df['real']
而不会出现错误吗?我是否需要创建一个单独的系列,然后使用
concat
将其添加到数据帧中,或者是否有一种方法可以用一行完成所有操作<代码>df['real']=df['nominal']*df['year'].映射(因子)
仍然存在错误。非常感谢。@amosoma:df是什么?它是其他数据帧的一部分吗?是的,它是另一个数据帧的一部分,只包含特定单位中带有“NORMAL”的行。TksYes@brenbarn,它是另一个数据帧的一部分,只包含以特定单位表示的
标称值的行。(如果您多次收到此回复,请道歉。)Tks@amosoma:好的,所以警告就是因为这个。不管你如何设置它;如果您尝试在该切片上设置值,您将得到该警告。正如我猜你发现的,你可以通过做整个切片,然后在一条巨大的直线上赋值来绕过它。但是,请注意,您看到的“错误”实际上是一个警告;尽管有警告,作业通常都能正常进行。谢谢@brenbarn!您不知道如何将其存储到
df['real']
而不会出现错误吗?我是否需要创建一个单独的系列,然后使用
concat
将其添加到数据帧中,或者是否有一种方法可以用一行完成所有操作<代码>df['real']=df['nominal']*df['year'].映射(因子)
仍然存在错误。非常感谢。@amosoma:df是什么?它是其他数据帧的一部分吗?是的,它是另一个数据帧的一部分,只包含特定单位中带有“NORMAL”的行。TksYes@brenbarn,它是另一个数据帧的一部分,只包含以特定单位表示的
标称值的行。(如果您多次收到此回复,请道歉。)Tks@amosoma:好的,所以警告就是因为这个。不管你如何设置它;如果您尝试在该切片上设置值,您将得到该警告。正如我猜你发现的,你可以通过做整个切片,然后在一条巨大的直线上赋值来绕过它。但是,请注意,您看到的“错误”实际上是一个警告;尽管有警告,作业通常都能正常进行。