Python 为什么不能在.apply()中使用DataFrame索引进行数据字典查找?

Python 为什么不能在.apply()中使用DataFrame索引进行数据字典查找?,python,pandas,dataframe,data-science,Python,Pandas,Dataframe,Data Science,我有一个数据框和一本字典。我想根据字典为DataFrame中的新列赋值 ContinentDictionary = {'United States':'North America', 'Japan':'Asia', 'United Kingdom':'Europe', 'Australia':'Australia',

我有一个数据框和一本字典。我想根据字典为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'
这就完成了任务,将一个大陆分配给国家数据框中的每个国家:

Countries['Continent'] = Countries.index.map(lambda x: ContinentDictionary[x])
这同样有效,但我需要事先将索引“Country”设置为一列,以便进行操作。应用工作:

Countries['Continent'] = Countries.reset_index(inplace = True)
Countries['Continent'] = Countries.apply(lambda x: ContinentDictionary[x['Country']], axis=1)
我想更好地理解这两种方法不起作用的原因,并感谢您的解释:

国家['Continental']=Countries.applylambda x:ContinentDictionary[x.index],axis=1 国家[大陆]=大陆词典[国家索引] 两者都给出:

TypeError: ("unhashable type: 'Index'"

在这两个版本中,我可以想象为什么2可能不起作用,但仍然希望更好地理解。

这取决于pandas的版本,在较旧的版本中,必须添加。获取,解决方案也是使用remove lambda和pass only dictionary简化:

编辑:可以从版本为映射器使用字典或系列:

Index.map现在可以接受序列和字典输入对象GH12756、GH18482和GH18509


这取决于pandas的版本,在较旧的版本中,必须添加.get,解决方案也是使用remove lambda和pass only dictionary进行简化:

编辑:可以从版本为映射器使用字典或系列:

Index.map现在可以接受序列和字典输入对象GH12756、GH18482和GH18509


这是对你的一些评论的回应

你写过我认为axis=1不会让我作为键传递整个索引,而是一个索引?我不能完全肯定我理解你的意思,所以让我试着澄清一些事情

当axis=1时,该函数对行进行操作。每行转换为一个系列。以下是其中一行作为一个系列的示例:

大号 Pi 6 PR160 名称:美国,数据类型:对象 调用x.index时,您希望在数据帧中收到x行的索引。实际上,您可以得到x系列的索引:

索引['Size','Pi','Pr'],dtype='object' 你是说,我只是可以使用索引值作为字典的键,而没有办法将索引转换为字符串?索引对象不能用作字典中的键,也不能用于任何需要哈希对象的情况。您可以将它们转换为字符串,就像我刚才所做的那样


正如@Jezrael在评论中提到的,对一个系列调用.apply可以获得单个元素,在本例中,这些元素没有索引。

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

你写过我认为axis=1不会让我作为键传递整个索引,而是一个索引?我不能完全肯定我理解你的意思,所以让我试着澄清一些事情

当axis=1时,该函数对行进行操作。每行转换为一个系列。以下是其中一行作为一个系列的示例:

大号 Pi 6 PR160 名称:美国,数据类型:对象 调用x.index时,您希望在数据帧中收到x行的索引。实际上,您可以得到x系列的索引:

索引['Size','Pi','Pr'],dtype='object' 你是说,我只是可以使用索引值作为字典的键,而没有办法将索引转换为字符串?索引对象不能用作字典中的键,也不能用于任何需要哈希对象的情况。您可以将它们转换为字符串,就像我刚才所做的那样


正如@Jezrael在评论中提到的,对一个系列调用.apply可以获得单个元素,在本例中,这些元素没有索引。

变量名应该在小写字母后面加下划线。另外,我想问一下,为什么你要把国家的名称作为索引,而不是简单地把它作为一列?谢谢,我会注意到适当的惯例!作为索引的国家的名称是我所使用的数据集。我确实把它改成了一个专栏,并且能够像上面那样申请工作。但我仍然不明白为什么我可以通过上面的索引1。apply方法可以简化为countries_df['country_name']。MapContinental_dict.Variable name应该遵循小写字母_加下划线的样式。另外,我想问一下,为什么你要把国家的名称作为索引,而不是简单地把它作为一列?谢谢,我会注意到适当的惯例!作为索引的国家的名称是我所使用的数据集。我确实把它改成了一个专栏,并且能够像上面那样申请工作。但我仍然不明白为什么我可以通过上面的索引1。应用方法可以简化为countries_df['country_name']。MapContinental_dict。谢谢,是的,我正在使用该解决方案。而且,我第一次尝试时使用了.get,但也没用。我不明白为什么当你可以传递一个单元格值的时候却不能传递索引。很好,我不敢相信我忘记了index.map是一件事@干扰机_man@AlexanderC埃西莉塔
nks,我在发布之前就得到了这个解决方案。但是我想理解为什么在apply函数中传递索引不起作用。“我只是对我肤浅的理解感到不高兴。@jammer\u man这与apply无关,事实上它不能作为字典的钥匙。”。即使可以,我也不认为代码有多大意义:您将整个索引作为键传递!当你考虑索引类型时,用列表替换它,这样会使它更简单。@jammer\u man不敢相信我忘记回答这个问题了。你可以把索引转换成一个字符串,这就是我在回答中提到的。不幸的是,你是对的,是的,你不能把它作为字典的钥匙。谢谢你,是的,我正在使用这个解决方案。而且,我第一次尝试时使用了.get,但也没用。我不明白为什么当你可以传递一个单元格值的时候却不能传递索引。很好,我不敢相信我忘记了index.map是一件事@干扰机_man@AlexanderC谢谢,我在发布之前就得到了这个解决方案。但是我想理解为什么在apply函数中传递索引不起作用。“我只是对我肤浅的理解感到不高兴。@jammer\u man这与apply无关,事实上它不能作为字典的钥匙。”。即使可以,我也不认为代码有多大意义:您将整个索引作为键传递!当你考虑索引类型时,用列表替换它,这样会使它更简单。@jammer\u man不敢相信我忘记回答这个问题了。你可以把索引转换成一个字符串,这就是我在回答中提到的。不幸的是你是对的,是的,你不能用它作为字典的钥匙。啊,我想我明白了,我觉得自己像个白痴。我一直认为axis=1返回的行不一定是可以访问每个元素的序列。我把这一行的图片想象成这样:索引:“日本”。尺寸:“小”。Pi:9。公关:300。通过诸如:row.Index之类的方式访问我所认为的“索引”感觉很方便。这与通过:for Index,row in Countries获取并使用该行的索引形成对比。iterrows:printindex@jammer_man数据框中行的索引,是。行有自己的索引。apply.Ah,我想我明白了,我觉得自己像个白痴。我一直认为axis=1返回的行不一定是可以访问每个元素的序列。我把这一行的图片想象成这样:索引:“日本”。尺寸:“小”。Pi:9。公关:300。通过诸如:row.Index之类的方式访问我所认为的“索引”感觉很方便。这与通过:for Index,row in Countries获取并使用该行的索引形成对比。iterrows:printindex@jammer_man数据框中行的索引,是。该行在.apply中有自己的索引。
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