【问题标题】:Add a new column to a Pandas DataFrame by using values in another column to lookup values in a dictionary通过使用另一列中的值在字典中查找值,将新列添加到 Pandas DataFrame
【发布时间】:2015-09-15 06:55:40
【问题描述】:

如何向 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.}

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

df['real'] = df['nominal'] * factors[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/ma​​in.py:5: SettingWithCopyWarning:试图在一个副本上设置一个值 从 DataFrame 切片。尝试使用 .loc[row_indexer,col_indexer] = 取而代之的价值

请参阅文档中的注意事项: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

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

提前致谢

【问题讨论】:

    标签: python numpy pandas ipython


    【解决方案1】:

    使用Series的map方法查字典:

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

    【讨论】:

    • 谢谢@brenbarn!您不会碰巧也知道如何将其存储到df['real'] 而不会出现该错误?我是否需要创建一个单独的系列,然后使用concat 将其添加到数据框中,或者有没有办法用一行来完成这一切? df['real'] = df['nominal'] * df['year'].map(factors) 仍然错误。非常感谢。
    • @amosoma:df 是什么?它是其他 DataFrame 的一部分吗?
    • 是的,它是另一个 DataFrame 的一部分,仅包含特定单位中带有“名义”的行。 Tks
    • 是的 @brenbarn,它是另一个 DataFrame 的一部分,仅包含特定单位中带有 nominal 的行。 (如果您多次收到此回复,我们深表歉意。)Tks
    • @amosoma:好的,所以警告就是因为这个。您如何尝试设置它并不重要。如果您尝试在该切片上设置值,您将收到该警告。正如我猜你发现的那样,你可以通过在一条巨大的线上完成整个切片和分配来解决它。但是,请注意,您看到的“错误”实际上是一个警告;尽管有警告,但作业通常会正常工作。
    【解决方案2】:

    经过一番困惑,我可以确认这就是你如何用一行来做的。这里的数据包含一列额外的单位;我正在过滤掉我不想使用的“比率”记录。关键是使用.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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-01
      • 2016-09-02
      • 2019-03-10
      • 2018-02-22
      相关资源
      最近更新 更多