Python 熊猫词典的层次索引

Python 熊猫词典的层次索引,python,pandas,dataframe,dictionary,indexing,Python,Pandas,Dataframe,Dictionary,Indexing,我有以下字典: ContinentDict = {'China':'Asia', 'United States':'North America', 'Japan':'Asia', 'United Kingdom':'Europe', 'Russian Federation':'Europe', 'Canad

我有以下字典:

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'}
Country
China                 1.36765e+09
United States         3.17615e+08
Japan                 1.27409e+08
United Kingdom         6.3871e+07
Russian Federation      1.435e+08
Canada                3.52399e+07
Germany               8.03697e+07
India                 1.27673e+09
France                6.38373e+07
South Korea           4.98054e+07
Italy                 5.99083e+07
Spain                 4.64434e+07
Iran                  7.70756e+07
Australia              2.3316e+07
Brazil                2.05915e+08
Name: estimate, dtype: object
我已经将这本词典中的国家(键)分为大陆(值)

from collections import defaultdict
dictionary = defaultdict(list)
for key, value in ContinentDict.items(): 
    dictionary[value].append(key)
这给了我:

dictionary
defaultdict(<class 'list'>, {'Asia': ['China', 'Japan', 'India', 'South Korea', 'Iran'], 'North America': ['United States', 'Canada'], 'Europe': ['United Kingdom', 'Russian Federation', 'Germany', 'France', 'Italy', 'Spain'], 'Australia': ['Australia'], 'South America': ['Brazil']})
我想从这本词典中创建一个等级索引
,以大陆为最高等级,其次是国家

我尝试了以下方法:

totuple = dictionary.items()
index = pd.MultiIndex.from_tuples(index)
hierarchy = pop.reindex(index)
但是,这没有起作用。


有谁能帮我一把吗?

创建元组列表并传递给:

然后:

Reducedset = Reducedset.reindex(index, level=1)
print (Reducedset)
                                      estimate
Asia          China               1.367650e+09
              Japan               1.274090e+08
              India               1.276730e+09
              South Korea         4.980540e+07
              Iran                7.707560e+07
North America United States       3.176150e+08
              Canada              3.523990e+07
Europe        United Kingdom      6.387100e+07
              Russian Federation  1.435000e+08
              Germany             8.036970e+07
              France              6.383730e+07
              Italy               5.990830e+07
              Spain               4.644340e+07
Australia     Australia           2.331600e+07
South America Brazil              2.059150e+08
另一个想法是使用原始词典的
map

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


d = {'estimate': {'China': 1367650000.0, 'United States': 317615000.0, 'Japan': 127409000.0, 'United Kingdom': 63871000.0, 'Russian Federation': 143500000.0, 'Canada': 35239900.0, 'Germany': 80369700.0, 'India': 1276730000.0, 'France': 63837300.0, 'South Korea': 49805400.0, 'Italy': 59908300.0, 'Spain': 46443400.0, 'Iran': 77075600.0, 'Australia': 23316000.0, 'Brazil': 205915000.0}}

Reducedset = pd.DataFrame(d)


当我尝试:Reducedset=Reducedset.reindex(index,level=1)时,这给了我一个错误:两个多索引对象之间的级别连接是不明确的。为什么会这样?@Caledonian26-我想你们先运行第一个解决方案,然后运行最后一段解决方案,但最后一个解决方案是第一个解决方案的替代方案。所以,使用第一个或第二个解决方案。最后一个解决方案不会按大陆对内部索引进行分组,我如何才能做到这一点?当我单独运行第一个解决方案时,我仍然收到错误消息:两个多索引对象之间的级别连接不明确。@Caledonin26-然后使用
df=df.sort\u index()
作为最后一个解决方案。实际上,当我这样做时,第一个解决方案工作:Reducedset=Reducedset.reindex(index)
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'}


d = {'estimate': {'China': 1367650000.0, 'United States': 317615000.0, 'Japan': 127409000.0, 'United Kingdom': 63871000.0, 'Russian Federation': 143500000.0, 'Canada': 35239900.0, 'Germany': 80369700.0, 'India': 1276730000.0, 'France': 63837300.0, 'South Korea': 49805400.0, 'Italy': 59908300.0, 'Spain': 46443400.0, 'Iran': 77075600.0, 'Australia': 23316000.0, 'Brazil': 205915000.0}}

Reducedset = pd.DataFrame(d)
idx = Reducedset.index.map(ContinentDict)
Reducedset.index = [idx, Reducedset.index]
Reducedset = Reducedset.sort_index()
print (Reducedset)
                                      estimate
Asia          China               1.367650e+09
              India               1.276730e+09
              Iran                7.707560e+07
              Japan               1.274090e+08
              South Korea         4.980540e+07
Australia     Australia           2.331600e+07
Europe        France              6.383730e+07
              Germany             8.036970e+07
              Italy               5.990830e+07
              Russian Federation  1.435000e+08
              Spain               4.644340e+07
              United Kingdom      6.387100e+07
North America Canada              3.523990e+07
              United States       3.176150e+08
South America Brazil              2.059150e+08