【问题标题】:Pandas stack groupby to DataFrame MultiIndex without aggregatingPandas 将 groupby 堆叠到 DataFrame MultiIndex 而不进行聚合
【发布时间】:2019-06-16 08:24:23
【问题描述】:

关于将 pandas 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()

(题外话,为什么要转换成浮点数?)

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

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

    【讨论】:

    • 谢谢你的作品。我打算在 Q 中进一步询问,如何迭代堆栈。例如,如果 `df.loc[x, 0] % 3` 给出 0 级索引 [0,1,2],想进一步按 %2 分组该索引以获得 3 级 MultiIndex,什么是合适的 lambda ?
    • @alancalvitti 看来您可以重复此过程两次,一次用于 %3,第二次用于 %2。
    • 但现在df.loc[x, 0] 将不起作用,因为分组是基于索引而不是值生成的。
    【解决方案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
    

    【讨论】:

    • 支持努力,但要实现简单的程序还有很长的路要走。
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 2021-05-18
    • 2015-06-28
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    相关资源
    最近更新 更多