Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用dict和map在Dataframe中创建新列只提供NaN_Python_Pandas_Dictionary_Dataframe - Fatal编程技术网

Python 使用dict和map在Dataframe中创建新列只提供NaN

Python 使用dict和map在Dataframe中创建新列只提供NaN,python,pandas,dictionary,dataframe,Python,Pandas,Dictionary,Dataframe,我有一个熊猫数据框 Rank % Renewable Country China 1 19.754910 Japan 3 10.232820 Canada 6 61.945430 Germany 7 17.901530 India 8 14.969080 France 9 17.020280 Italy 11 33.667230 Spain 12 37.968590 Iran 13 5.707721 Brazil

我有一个熊猫数据框

       Rank % Renewable
Country     
China   1   19.754910
Japan   3   10.232820
Canada  6   61.945430
Germany 7   17.901530
India   8   14.969080
France  9   17.020280
Italy   11  33.667230
Spain   12  37.968590
Iran    13  5.707721
Brazil  15  69.648030
我使用字典将值映射到一个名为Continental的新列中,使用我在类似答案中找到的以下代码

df['continent'] = pd.Series(df.index.values).map(ContinentDict)
作为一个独立的人

ContinentDict  = {'China':'Asia', 
              'United States':'North America', 
              'Japan':'Asia', 
              'United Kingdom':'Europe', 
              'Russian Federation':'Europe', 
              'Canada':'North America', 
              'Germany':'Europe', 
              'India':'Asia',
              'France':'Europe', 
              'South Korea':'Asia', 
              'Italy':'Europe', 
              'Spain':'Europe', 
              'Iran':'Asia',
              'Australia':'Australia', 
              'Brazil':'South America'}
“欧洲大陆”列中的所有新项目都是“南”,这里有人能帮我吗?

你要吗

In[90]:
df['continent'] = df.index.to_series().map(ContinentDict)
df

Out[90]: 
         Rank  % Renewable      continent
Country                                  
China       1    19.754910           Asia
Japan       3    10.232820           Asia
Canada      6    61.945430  North America
Germany     7    17.901530         Europe
India       8    14.969080           Asia
France      9    17.020280         Europe
Italy      11    33.667230         Europe
Spain      12    37.968590         Europe
Iran       13     5.707721           Asia
Brazil     15    69.648030  South America
您尝试的内容:

In[91]:
pd.Series(df.index.values).map(ContinentDict)

Out[91]: 
0             Asia
1             Asia
2    North America
3           Europe
4             Asia
5           Europe
6           Europe
7           Europe
8             Asia
9    South America
dtype: object

生成
NaN
,因为您正在从numpy值构造一个
系列
,所以返回的索引是自动生成的
RangeIndex
,所以当它尝试与df对齐时,它失败了,所以所有行都变为
NaN

以确保完整性:

pd.Index
肯定有一个方法。但是,从0.20.3开始,只需要一个callable。这意味着它不适用于字典。我们可以通过向它传递一个callable来改变这一点。事实上,字典已经有了适合我们的方法。即


@MaxU我不认为有一个
map
方法用于
索引
对象,你需要一个
系列
@EdChum,是的,你是对的!我们可以这样做:
df.index.map(lambda x:contractiondict.get(x))
,但您的解决方案应该更快…@MaxU我没有看到此评论。是的,你的想法很管用。但无需通过lambda,只需通过
columndict.get
,见下文。它有效,你很快,“你可以在3分钟内接受答案”:)现在我明白了区别。+1.要使OP的方法有效,需要手动分配索引,即
pd.Series(df.index.values,index=df.index.map(columndict)
@Bharathshetty是真的,但是当
索引
对象已经有了一个
to_系列
时,创建一个新的
系列
对象似乎是多余的,这将使现有的索引完全一致。这只是为了使方法有效。投票表明
to_系列
仍然是最好的。@Bharathshetty你可以使用
映射
索引上
。请参阅下面的答案。+1顺便说一句(-:Nice真的很好。我在评论中看到了MaxU发布的内容。不知道这是可能的这没有列在文档中,所以我认为这不会起作用+1
df['continent'] = df.index.map(ContinentDict.get)

df

         Rank  % Renewable      continent
Country                                  
China       1    19.754910           Asia
Japan       3    10.232820           Asia
Canada      6    61.945430  North America
Germany     7    17.901530         Europe
India       8    14.969080           Asia
France      9    17.020280         Europe
Italy      11    33.667230         Europe
Spain      12    37.968590         Europe
Iran       13     5.707721           Asia
Brazil     15    69.648030  South America