Python 将groupby堆栈到DataFrame多索引,而不进行聚合

Python 将groupby堆栈到DataFrame多索引,而不进行聚合,python,pandas,dataframe,Python,Pandas,Dataframe,关于将pandas groupby对象转换为DataFrame的几个问题似乎涉及聚合,例如count() groupby对象是否可以在不聚合的情况下转换为数据帧,其中组名成为多索引的0级?这个过程可以迭代吗 from pandas import DataFrame as DF df = DF.from_dict({'a':1, 'b':2, 'c':3, 'd':4, 'e':5}, orient='index') 要查看分组的输出: df.groupby(lambda x: df[0][x

关于将pandas groupby对象转换为DataFrame的几个问题似乎涉及聚合,例如
count()

groupby对象是否可以在不聚合的情况下转换为数据帧,其中组名成为多索引的0级?这个过程可以迭代吗

from pandas import DataFrame as DF

df = DF.from_dict({'a':1, 'b':2, 'c':3, 'd':4, 'e':5}, orient='index')
要查看分组的输出:

df.groupby(lambda x: df[0][x]%2)
转换为以下格式:

DF.from_dict({0:{'b':2,'d':4},1:{'a':1,'c':3,'e':5}},orient='index').stack().to_frame()


(除了这一点,为什么要将值转换为浮点数?

使用
pd.concat
,它接受字典:

pd.concat({k: v for k, v in df.groupby(lambda x: df.loc[x, 0] % 2)})

     0
0 b  2
  d  4
1 a  1
  c  3
  e  5
迭代每个组并构建字典。词典可以使用


不涉及可调用项的稍快的解决方案可以通过

pd.concat({k: v for k, v in df.groupby(df.iloc[:,0] % 2)})

     0
0 b  2
  d  4
1 a  1
  c  3
  e  5

如果需要,请反复执行此操作,尝试一个函数

def add_level(df, grouper):
    return pd.concat({k: v for k, v in df.groupby(by=grouper)})

r = add_level(df, df.iloc[:,0] % 3)
add_level(r, r.iloc[:, 0] % 2)

       0
0 1 d  4
  2 b  2
1 0 c  3
  1 a  1
  2 e  5

使用
assign
链和
set\u索引

df.assign(indexlevel=np.arange(len(df))%2).\
    set_index('indexlevel',append=True).\
      swaplevel(0,1).\
       sort_index(level=0)
Out[30]: 
              0
indexlevel     
0          a  1
           c  3
           e  5
1          b  2
           d  4

谢谢,这很有效。我将在Q中进一步询问,如何迭代堆栈。例如,如果'df.loc[x,0]%3'给出了0级索引[0,1,2],想将此索引进一步分组%2以获得一个3级多索引,那么合适的lambda是多少?@alancalvitti您似乎可以重复此过程两次,一次为%3,第二次为%2。但是现在
df.loc[x,0]
不起作用,因为分组是基于索引而不是值生成的。向上投票表示努力,但对于一个简单的过程来说,这还有很长的路要走。