使用嵌套字典创建多索引“系列”

Posted

技术标签:

【中文标题】使用嵌套字典创建多索引“系列”【英文标题】:Creating a multiindexed `Series` with a nested dictionary 【发布时间】:2017-03-08 17:54:26 【问题描述】:

在我看来,我想做的事情应该是直截了当的,就像将它传递给构造函数一样直截了当,但实际上并非如此。我有一本像下面这样的字典。

d = "russell": "score": numpy.random.rand(), "ping": numpy.random.randint(10, 100),
    "cantor": "score": numpy.random.rand(), "ping": numpy.random.randint(10, 100),
    "godel": "score": numpy.random.rand(), "ping": numpy.random.randint(10, 100)

我想做类似pandas.Series(d) 的事情并获得一个Series 实例,如下所示。

russell  score  0.87391482
         ping   23
cantor   score  0.77821932
         ping   16
godel    score  0.53372128
         ping   35

但我实际得到的是下面。

cantor     'ping': 44, 'score': 0.007408727109865398
godel        'ping': 41, 'score': 0.9338940910283948
russell       'ping': 74, 'score': 0.733817307366666

有没有办法实现我想要实现的目标?

【问题讨论】:

【参考方案1】:

我认为你需要DataFrame 构造函数和unstack

import pandas as pd
import numpy as np

d = "russell": "score": np.random.rand(), "ping": np.random.randint(10, 100),
    "cantor": "score": np.random.rand(), "ping": np.random.randint(10, 100),
    "godel": "score": np.random.rand(), "ping": np.random.randint(10, 100)

print (pd.DataFrame(d).unstack())  

cantor   ping     33.000000
         score     0.240253
godel    ping     64.000000
         score     0.435040
russell  ping     41.000000
         score     0.171810
dtype: float64

如果需要MultiIndex 中的交换级别,请使用stack

print (pd.DataFrame(d).stack())    
ping   cantor     64.000000
       godel      40.000000
       russell    66.000000
score  cantor      0.265771
       godel       0.283725
       russell     0.085856
dtype: float64

【讨论】:

以上是关于使用嵌套字典创建多索引“系列”的主要内容,如果未能解决你的问题,请参考以下文章

从嵌套字典构造熊猫多索引数据框

来自嵌套字典的多索引数据框

如何在嵌套字典中按元素访问熊猫多索引?

Groupby 使用字典的多索引列

使用 Pandas 从查找字典中重命名多索引行

如何使用 Pandas 将多索引系列加入单个索引数据框?