【问题标题】:Including columns using MAP and dictionary in a dataframe在数据框中包含使用 MAP 和字典的列
【发布时间】:2018-06-05 09:23:04
【问题描述】:

我正在尝试在数据框中包含一列。我正在使用MAP 工具来添加它,因为它应该被引用到一个变量。

这是当前的数据框:

  X      Y            Z
  xx    high         10
        slow         20
        fat          30
  xy    high         15
        slow         10
        fast         30

我想包含一个column D,以X 作为参考。此新列应基于具有以下值的 dict(字典):

{'xx': -4.50, 'xy': -10.21}

所以我做到了:

df['D'] = df['X'].map(dicc)

但是,当我运行代码时,会出现一条消息 KeyError: 'X' 。我是在代码中遗漏了什么还是数据类型(str/float)有问题?

任何帮助将不胜感激。 非常感谢!

编辑: 我从 groupby 获取数据框,以 XY 作为参考(感谢您的评论)。

【问题讨论】:

  • X 似乎是一个索引,而不是一个列。

标签: python-3.x dictionary dataframe data-manipulation


【解决方案1】:

你可以使用一个简单的列表推导来做到这一点

df = pd.DataFrame({'X':['xx', 'xx', 'xx', 'xy', 'xy', 'xy'], 
                   'Y':['high', 'slow', 'fat']*2, 
                   'Z':[10, 20, 30, 15, 10, 30]})

dicc = {'xx': -4.5, 'xy':-10.21}

df['D'] = [dicc[i] for i in df['X']]

e 额外:如果您的 df 来自一个 grouby 并且代码因为找不到列“X”而出现错误,那是因为“X”现在是一个索引列。要解决这个问题,只需说 df = df.reset_index() 让您的 DF 看起来像这个答案中的那个。

【讨论】:

    【解决方案2】:

    你可以使用map,但首先需要转换MultiIndexto_series的等级:

    dicc = {'xx': -4.50, 'xy': -10.21}
    
    L = [df.index.get_level_values('X').to_series().map(dicc),
         df.index.get_level_values('Y')]
    
    df.index = pd.MultiIndex.from_arrays(L, names = df.index.names)
    #alternative solution
    #df = df.set_index(pd.MultiIndex.from_arrays(L, names = df.index.names))
    
    
    print (df)
                  Z
    X      Y       
    -4.50  high  10
           slow  20
           fat   30
    -10.21 high  15
           slow  10
           fast  30
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-20
      • 2019-04-21
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多