如何在 Pandas 中创建多级索引

10

问题

有两个看起来相似但实际上不是同一个问题的问题:这里这里。它们都调用了GroupBy的方法,例如count()aggregate(),我知道这些方法返回一个DataFrame。我的问题是如何将GroupBy(类pandas.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个回答

12

您需要使用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分钟内接受这个答案。谢谢。 - Ray
1
当我尝试使用这个答案时,我遇到了一个 AttributeError 错误。"无法访问 'DataFrameGroupBy' 对象的可调用属性 'set_index',请尝试使用 'apply' 方法"。 - Nate
1
@Nate - 看起来 data 不是 DataFrame,而是 groupby 的输出 - 因此需要 g = df.groupby('col'),然后 g.apply(lambda x: x['col1'].set_index()) - jezrael
5
这并没有回答实际问题:如何将DataFrameGroupBy转换为DataFrame。 - James Hirschorn
@JamesHirschorn - 你是对的,标题是错误的。更好的应该是如何将DataFrame中的MultiIndex转换为列。 - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接