如何在 Pandas 中创建多索引
Posted
技术标签:
【中文标题】如何在 Pandas 中创建多索引【英文标题】:How to create a multi-index in Pandas 【发布时间】:2017-03-07 07:03:51 【问题描述】:问题
有两个问题看起来相似,但它们不是同一个问题:here 和 here。它们都调用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】:你需要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 中创建多索引的主要内容,如果未能解决你的问题,请参考以下文章