基于groupby拆分pandas数据帧

use*_*827 41 python pandas

我想基于ZZ列拆分以下数据帧

df = 
        N0_YLDF  ZZ        MAT
    0  6.286333   2  11.669069
    1  6.317000   6  11.669069
    2  6.324889   6  11.516454
    3  6.320667   5  11.516454
    4  6.325556   5  11.516454
    5  6.359000   6  11.516454
    6  6.359000   6  11.516454
    7  6.361111   7  11.516454
    8  6.360778   7  11.516454
    9  6.361111   6  11.516454
Run Code Online (Sandbox Code Playgroud)

作为输出,我想要一个新的数据帧,其中'N0_YLDF'列分为4个,每个ZZ的唯一值一个新列.我该怎么做?我可以做groupby,但不知道如何处理分组对象.

qww*_*wwq 84

gb = df.groupby('ZZ')    
[gb.get_group(x) for x in gb.groups]
Run Code Online (Sandbox Code Playgroud)


Ant*_*vBR 9

还有另一种选择,因为groupby返回一个生成器,我们可以简单地使用列表理解来检索第二个值(帧)。

dfs = [x for _, x in df.groupby('ZZ')]
Run Code Online (Sandbox Code Playgroud)


ALo*_*llz 7

将它们存储在 中dict,这允许您根据组键访问组 DataFrame。

d = dict(tuple(df.groupby('ZZ')))
d[6]

#    N0_YLDF  ZZ        MAT
#1  6.317000   6  11.669069
#2  6.324889   6  11.516454
#5  6.359000   6  11.516454
#6  6.359000   6  11.516454
#9  6.361111   6  11.516454
Run Code Online (Sandbox Code Playgroud)

如果您只需要 DataFrame 的子集(在本例中仅需要'NO_YLDF'Series),则可以修改 dict 理解。

d = dict((idx, gp['N0_YLDF']) for idx, gp in df.groupby('ZZ'))
d[6]
#1    6.317000
#2    6.324889
#5    6.359000
#6    6.359000
#9    6.361111
#Name: N0_YLDF, dtype: float64
Run Code Online (Sandbox Code Playgroud)


Jef*_*ell 6

在 R 中有一个名为 split 的数据帧方法。这适用于所有 R 用户:

def split(df, group):
     gb = df.groupby(group)
     return [gb.get_group(x) for x in gb.groups]
Run Code Online (Sandbox Code Playgroud)

  • 只是为了提供评论的答案(在链接中有更详细的解释:`[(key, gb.get_group(key)) for key in gb.groups]` (3认同)