通过使用另一列中的值来查找字典中的值,将新列添加到Pandas DataFrame

时间:2015-09-15 06:55:41

标签: python numpy pandas ipython

如何将列添加到Pandas DataFrame中,方法是将现有列乘以使用同一DataFrame中第二列的值作为键查找的外部字典中的因子?

我的pd.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作为字典:

factors = {'2008-09': 1.11075, '2010-11': 1.02947, '2012-13': 1.}

我想通过将每个名义值乘以适当的因子来添加列,我想在外部factors词典中使用数据框{{1}中的第二列df['year']查找该列}作为关键

df

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

但这两者都会产生错误。我也试过像

这样的东西
df['real'] = df.nominal * factors[df.year]

产生以下错误

  

/用户/.../安纳康达/ LIB / python2.7 /站点包/ ipykernel / 主要的.py:5:   SettingWithCopyWarning:尝试在a的副本上设置值   从DataFrame切片。尝试使用.loc [row_indexer,col_indexer] =   代替值

     

请参阅文档中的警告:   http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

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

提前致谢

2 个答案:

答案 0 :(得分:3)

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

df['nominal'] * df['year'].map(factors)

答案 1 :(得分:0)

经过一番困惑之后,我可以确认这就是你用一条线做到的。这里的数据包含一列额外的单位;我正在过滤掉“比率”记录,我不想使用它们。关键是将.loc方法described here.map

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