需要帮助通过将一个列分组将pandas数据帧转换为多索引。

时间:2018-04-20 13:05:43

标签: python pandas dataframe

我有一个pandas数据帧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帮助页面并查看论坛似乎已经为那些已经使用元组创建了多索引数据框的人提供了解决方案。

1 个答案:

答案 0 :(得分:2)

set_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

或者,创建一个MultiIndex对象并分配给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

Just Like That™。

如果你不喜欢最后的xs,那么当然可以选择将你的DataFrame分成几组并将每一个转换成字典。

编写groupby API是为了模仿itertools.groupby类似dict的习语,这里的内容如下:

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

请注意,这不再是单个DataFrame,而是词典