如何在 Pandas 中创建多索引

Posted

技术标签:

【中文标题】如何在 Pandas 中创建多索引【英文标题】:How to create a multi-index in Pandas 【发布时间】:2017-03-07 07:03:51 【问题描述】:

问题

有两个问题看起来相似,但它们不是同一个问题:here 和 here。它们都调用GroupBy 的方法,例如count()aggregate(),我知道它返回DataFrame。我要问的是如何将GroupBypandas.core.groupby.DataFrameGroupBy 类)对象本身转换为DataFrame。下面我会举例说明。

示例

如下构造示例DataFrame

data_list = []
for name in ["sasha", "asa"]:
    for take in ["one", "two"]:
        row = "name": name, "take": take, "score": numpy.random.rand(), "ping": numpy.random.randint(10, 100)
        data_list.append(row)
data = pandas.DataFrame(data_list)

上面的DataFrame 应该如下所示(显然数字不同)。

    name  ping     score take
0  sasha    72  0.923263  one
1  sasha    14  0.724720  two
2    asa    76  0.774320  one
3    asa    71  0.128721  two

我想要做的是按列“name”和“take”(按此顺序)分组,这样我就可以获得由“name”和“take”列构建的多索引索引的DataFrame ",如下所示。

               score  ping
 name take        
sasha  one  0.923263    72
       two  0.724720    14
  asa  one  0.774320    76
       two  0.128721    71

我如何做到这一点?如果我做grouped = data.groupby(["name", "take"]),那么grouped 就是pandas.core.groupby.DataFrameGroupBy 实例。这样做的正确方法是什么?

【问题讨论】:

【参考方案1】:

你需要set_index:

data = data.set_index(['name','take'])
print (data)
            ping     score
name  take                
sasha one     46  0.509177
      two     77  0.828984
asa   one     51  0.637451
      two     51  0.658616

【讨论】:

噢噢噢!!!真的!!!!好的,当 Stack Overflow 允许我时,我会在 9 分钟内接受这个答案。谢谢。 当我尝试使用这个答案时,我得到一个AttributeError。 "无法访问 'DataFrameGroupBy' 对象的可调用属性 'set_index',请尝试使用 'apply' 方法" @Nate - 似乎data 不是DataFrame,而是groupby 的输出 - 所以需要g = df.groupby('col') 然后g.apply(lambda x: x['col1'].set_index()) 这并没有回答实际问题:如何将 DataFrameGroupBy 转换为 DataFrame。 @JamesHirschorn - 你是对的,标题是错误的。更好的应该是如何将 MultiIndex 转换为 DataFrame 中的列。

以上是关于如何在 Pandas 中创建多索引的主要内容,如果未能解决你的问题,请参考以下文章

如何获取多索引数据帧的前两个索引的字典

如何在 pandas DataFrame 中恢复\展开多索引

如何在多索引列上使用 pandas rename()?

Pandas:如何向多索引数据框添加列?

Pandas:如何创建多索引枢轴

Pandas groupby(),agg() - 如何在没有多索引的情况下返回结果?