按对象将熊猫分组转换为多索引数据框

Posted

技术标签:

【中文标题】按对象将熊猫分组转换为多索引数据框【英文标题】:Convert pandas group by object to multi-indexed Dataframe 【发布时间】:2012-12-27 10:29:24 【问题描述】:

如果我有以下数据框

>>> df = pd.DataFrame('Name': ['Bob'] * 3 + ['Alice'] * 3, \
'Destination': ['Athens', 'Rome'] * 3, 'Length': np.random.randint(1, 6, 6)) 
>>> df    
  Destination  Length   Name
0      Athens       3    Bob
1        Rome       5    Bob
2      Athens       2    Bob
3        Rome       1  Alice
4      Athens       3  Alice
5        Rome       5  Alice

我可以按名称和目的地进行搜索...

>>> grouped = df.groupby(['Name', 'Destination'])
>>> for nm, gp in grouped:
>>>     print nm
>>>     print gp
('Alice', 'Athens')
  Destination  Length   Name
4      Athens       3  Alice
('Alice', 'Rome')
  Destination  Length   Name
3        Rome       1  Alice
5        Rome       5  Alice
('Bob', 'Athens')
  Destination  Length Name
0      Athens       3  Bob
2      Athens       2  Bob
('Bob', 'Rome')
  Destination  Length Name
1        Rome       5  Bob

但我想要一个新的多索引数据框,看起来像

                Length
Alice   Athens       3
        Rome         1
        Rome         5
Bob     Athens       3
        Athens       2
        Rome         5

似乎应该有一种方法来执行类似Dataframe(grouped) 的方法来获取我的多索引数据帧,但我得到了一个PandasError(“DataFrame 构造函数未正确调用!”)。

最简单的方法是什么?另外,任何人都知道是否可以选择将 groupby 对象传递给构造函数,或者我只是做错了吗?

谢谢

【问题讨论】:

【参考方案1】:

由于您没有聚合索引相似的行,请尝试使用列名列表设置索引。

In [2]: df.set_index(['Name', 'Destination'])
Out[2]: 
                   Length
Name  Destination        
Bob   Athens            3
      Rome              5
      Athens            2
Alice Rome              1
      Athens            3
      Rome              5

【讨论】:

以上是关于按对象将熊猫分组转换为多索引数据框的主要内容,如果未能解决你的问题,请参考以下文章

ValueError 将多索引熊猫数据框转换为 Excel

如何将多索引列转换为熊猫数据框的单索引列?

来自按级别分组的多索引熊猫数据框的子图

将熊猫多索引数据框重塑为多列

如何对熊猫中的多索引进行分组?

熊猫将第一个多索引转换为行索引,将第二个多索引转换为列索引