我有一个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,有人可以帮我吗?
答案 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