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

问题

有两个问题看起来相似,但它们不是同一个问题:herehere。它们都调用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 实例。这样做的正确方法是什么?

【问题讨论】:

    标签: python pandas


    【解决方案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 中的列。
    猜你喜欢
    • 2021-05-15
    • 2016-11-07
    • 2021-03-04
    • 2019-10-28
    • 2019-12-07
    • 1970-01-01
    • 2014-11-15
    • 2021-01-29
    • 1970-01-01
    相关资源
    最近更新 更多