为什么不能在.apply()中将DataFrame索引用于数据字典查找?

时间:2019-12-03 07:23:49

标签: python pandas dataframe data-science

我有一个DataFrame和一个Dictionary。我想根据字典将值分配给DataFrame中的新列。

ContinentDictionary  = {'United States':'North America', 
                        'Japan':'Asia', 
                        'United Kingdom':'Europe', 
                        'Australia':'Australia', 
                        'Argentina':'South America'}

c1 = pd.Series({'Size':'Large','Pi':6,'Pr':160})
c2 = pd.Series({'Size':'Small','Pi':9,'Pr':235})
c3 = pd.Series({'Size':'Large','Pi':12,'Pr':300})
Countries = pd.DataFrame([c1,c2,c3],index=['United States','Japan','United Kingdom'])
Countries.index.name='Country'

这可以完成工作,在Countrys DataFrame中为每个国家/地区分配一个洲:

Countries['Continent'] = Countries.index.map(lambda x: ContinentDictionary[x])

这也可以,但是我需要预先将索引“国家”设置为一列,以使.apply工作:

Countries['Continent'] = Countries.reset_index(inplace = True)
Countries['Continent'] = Countries.apply(lambda x: ContinentDictionary[x['Country']], axis=1)

我想更好地了解这两种方法为何行不通,并感谢您做出解释:

  1. Countries['Continent'] = Countries.apply(lambda x: ContinentDictionary[x.index], axis=1)
  2. Countries['Continent'] = ContinentDictionary[Countries.index]

两个都给

TypeError: ("unhashable type: 'Index'"

在这两者之间,我可以想象为什么#2可能不起作用,但仍然希望更好地理解。

2 个答案:

答案 0 :(得分:2)

这取决于熊猫的版本,在较旧的版本中必须添加.get,解决方案也很简单,只需删除lambda并仅传递dictionary

Countries['Continent'] = Countries.index.map(ContinentDictionary.get)
print (Countries)
                 Size  Pi   Pr      Continent
United States   Large   6  160  North America
Japan           Small   9  235           Asia
United Kingdom  Large  12  300         Europe

编辑:从版本pandas 0.23+起,可以使用字典或Mapper系列:

  

Index.map()现在可以接受系列和字典输入对象(GH12756,GH18482,GH18509)。

答案 1 :(得分:1)

这是对您的一些评论的回应。


您写了我以为axis = 1不会让我将整个索引作为键传递,而是将一个索引传递给了键?我不确定是否完全理解您的意思,所以让我尝试澄清一些东西。

使用axis=1,该函数在行上运行。每行都转换为一个系列。这是其中一个行作为系列的示例:

Size    Large
Pi          6
Pr        160
Name: United States, dtype: object

调用x.index时,您希望在DataFrame中收到行x 的索引。实际上,您可以获得系列 x的索引:

Index(['Size', 'Pi', 'Pr'], dtype='object')

所以你是说,我只是可以使用“ index”值作为字典的键,并且无法将索引转换为字符串?不能将index对象用作字典中的键,或在任何需要可哈希对象的情况下。您可以像上面一样将它们转换为字符串。


就像@Jezrael在评论中提到的那样,在Series上调用.apply()可以获取各个元素,在这种情况下,它们没有索引。