我有一个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)
我想更好地了解这两种方法为何行不通,并感谢您做出解释:
Countries['Continent'] = Countries.apply(lambda x: ContinentDictionary[x.index], axis=1)
Countries['Continent'] = ContinentDictionary[Countries.index]
两个都给
TypeError: ("unhashable type: 'Index'"
在这两者之间,我可以想象为什么#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()
可以获取各个元素,在这种情况下,它们没有索引。