Python 需要帮助通过仅对一列进行分组将数据帧转换为多索引。

Python 需要帮助通过仅对一列进行分组将数据帧转换为多索引。,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个熊猫数据帧df,看起来像这样: >>>df group A B C 1 1 2 3 1 2 3 6 1 4 9 9 2 8 1 2 2 5 6 4 3 6 5 7 我想它多索引,所以它看起来像 group A B C 1 1 2 3 2 3 6 4 9 9 2 8 1 2 5 6 4 3 6 5 7 我想访问每个组号,它给我一个数据帧,其中只包含

我有一个熊猫数据帧
df
,看起来像这样:

>>>df
group A B C
1     1 2 3
1     2 3 6
1     4 9 9
2     8 1 2
2     5 6 4
3     6 5 7
我想它多索引,所以它看起来像

group 
      A B C
1     1 2 3
      2 3 6
      4 9 9
2     8 1 2
      5 6 4
3     6 5 7
我想访问每个组号,它给我一个数据帧,其中只包含该组索引的值。我的意思是,如果我键入
df[0]
,那么

>>>df[0]
A B C
1 2 3
2 3 6
4 9 9
我可以做一些常用的功能,比如通过
df[0]取平均值。mean()


我相信这是可能的,但阅读pandas帮助页面和浏览论坛似乎为那些已经创建了具有元组的多索引数据帧的人提供了解决方案

set\u index
将为您执行此操作

df = df.set_index('group').set_index(
    df.groupby('group').cumcount(), append=True
)

df
         A  B  C
group           
1     0  1  2  3
      1  2  3  6
      2  4  9  9
2     0  8  1  2
      1  5  6  4
3     0  6  5  7
或者,创建一个
多索引
对象并分配给
df.index
。这在内存方面要有效得多

i = df['group']
j = df.groupby(df.pop('group')).cumcount()

df.index = pd.MultiIndex.from_arrays([i, j])
现在

df.xs(1)

   A  B  C
0  1  2  3
1  2  3  6
2  4  9  9
就这样™.


如果您不喜欢结尾的
xs
,那么当然可以选择将数据帧拆分为组,并将每个组转储到字典中

编写
groupby
API是为了模仿
itertools.groupby
dict-like习惯用法,下面是它的样子:

df_dict = {k : g for k, g in df.drop('group', 1).groupby(df.group)}
df_dict[1]

   A  B  C
0  1  2  3
1  2  3  6
2  4  9  9

请注意,这不再是一个单一的数据帧,而是它们的字典。

Downvoter,请让我知道你为什么对这个答案嗤之以鼻。您的反馈将帮助我纠正任何错误。谢谢,回答得真棒+这是工作!但是这太复杂了,我希望你会同意。如果有一个短得多的方法肯定会很好。不必通过df.xs()引用分组,而是通过标准的df[column]引用分组,这也很有用。顺便说一句,我没有投反对票@谢谢你,我感谢你的支持。你可以指望我会报答你:)@AstroBen不,我会解释原因的。为了以您想要的方式索引多索引,您需要提供
slice
对象。但是,切片是不可散列的,因此这不能直接工作。您需要通过像
loc
xs
这样的访问器来提取切片。另一种方法是保留groupby对象的字典。等等,让我再编辑一次:p