【问题标题】:Hierarchical indexing from a pandas dictionary来自 pandas 字典的分层索引
【发布时间】:2020-09-01 02:45:54
【问题描述】:

我有以下字典:

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

我已将这本字典 (keys) 中的 国家 分类为 continents (values)

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

我也有 Pandas 系列Reducedset['estimate']:

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

我想从这本字典创建一个层次索引,大​​陆是层次结构的顶部,其次是国家。

我尝试了以下方法:

totuple = dictionary.items()
index = pd.MultiIndex.from_tuples(index)
hierarchy = pop.reindex(index)

但是,这不起作用。

有人能帮我一把吗?

【问题讨论】:

    标签: python pandas dataframe dictionary indexing


    【解决方案1】:

    创建元组列表并传递给MultiIndex.from_tuples

    t = [(k, x) for k, v in dictionary.items() for x in v]
    index = pd.MultiIndex.from_tuples(t)
    print (index)
    MultiIndex([(         'Asia',              'China'),
                (         'Asia',              'Japan'),
                (         'Asia',              'India'),
                (         'Asia',        'South Korea'),
                (         'Asia',               'Iran'),
                ('North America',      'United States'),
                ('North America',             'Canada'),
                (       'Europe',     'United Kingdom'),
                (       'Europe', 'Russian Federation'),
                (       'Europe',            'Germany'),
                (       'Europe',             'France'),
                (       'Europe',              'Italy'),
                (       'Europe',              'Spain'),
                (    'Australia',          'Australia'),
                ('South America',             'Brazil')],
               )
    

    然后:

    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)
    

    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
    

    【讨论】:

    • 当我尝试时:Reducedset = Reducedset.reindex(index, level=1),这给了我错误:两个 MultiIndex 对象之间的级别连接不明确。这是为什么呢?
    • @Caledonian26 - 我认为您运行第一个解决方案,然后运行最后一段解决方案,但最后一个解决方案是第一个解决方案的替代方案。所以使用第一个或第二个解决方案。
    • 最后一个解决方案没有按大陆对内部索引进行分组,我该怎么做?当我单独运行第一个解决方案时,我仍然收到错误消息:两个 MultiIndex 对象之间的级别连接不明确。
    • @Caledonian26 - 然后使用df = df.sort_index() 作为最后一个解决方案。
    • 实际上第一个解决方案在我这样做时有效:Reducedset = Reducedset.reindex(index)
    猜你喜欢
    • 2019-10-04
    • 1970-01-01
    • 2017-04-23
    • 2022-12-22
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    相关资源
    最近更新 更多