熊猫通过groupby到DataFrame MultiIndex而不进行聚合

时间:2019-01-22 19:52:24

标签: python pandas dataframe

有关将大熊猫groupby对象转换为DataFrame的几个问题似乎涉及聚合,例如count() here

是否可以将groupby对象转换为DataFrame 而不进行汇总,而组名称变为MultiIndex的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()

enter image description here

(除此以外,为什么将值转换为浮点数?)

2 个答案:

答案 0 :(得分:3)

使用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

遍历每个组并构建字典。可以使用dictionary comprehension来构造字典。


可以完成一个不涉及可调用项的更快解决方案,

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

答案 1 :(得分:2)

assign链与set_index一起使用

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