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

时间:2017-10-06 15:20:29

标签: python pandas dictionary dataframe

我有一个Pandas 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  15  69.648030

我使用字典将值映射到一个名为continent的新列,使用我在类似答案中找到的以下代码,

df['continent'] = pd.Series(df.index.values).map(ContinentDict)

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'}

continent列中的所有新项目都是NaN,有人可以帮我吗?

2 个答案:

答案 0 :(得分:5)

你想要

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值构造Series,因此返回的索引是自动生成的RangeIndex所以当它尝试与您的df对齐时,它会失败所以所有行都变为NaN

答案 1 :(得分:4)

完整性:

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

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