使用groupby根据列中的值拆分pandas数据框。

87

我想根据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

作为输出,我想要一个新的DataFrame,其中N0_YLDF列被分成4个部分,每个唯一值ZZ都有一个新的列。我该怎么做?我可以使用groupby,但不知道如何处理分组对象。
5个回答

174
gb = df.groupby('ZZ')    
[gb.get_group(x) for x in gb.groups]

很棒的答案!我们如何从gb中提取相应的数据框? - maximus
方法 get_group(x) 返回一个新的 DataFrame 对象,其中仅包含列 ZZ == x 的行。 - qwwqwwq

40

还有另一种选择,由于groupby返回一个生成器,我们可以简单地使用列表推导式来获取第二个值(框架)。

dfs = [x for _, x in df.groupby('ZZ')]

如果我想对每个数据框进行特定的聚合,这个一行代码是否有效? - DataPlug
这个一行代码简单地将数据框存储在数组中,你接下来要做什么由你决定。也许可以看看ALollz的答案以访问键。 - Anton vBR

12

在 R 中有一个称为 split 的数据框方法。这是给所有 R 用户的:

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

你应该把它们都放到一个序列中,以 pd.Series(...) 结尾。 - Adam
1
这太棒了。有没有简单的方法来获取标识组的键,以便我可以返回元组列表,例如[(key, gb.get_group(x)) for x in gb.group] - rsmith54
我找到了这个,可以让这件事变得容易: https://dev59.com/ZVgQ5IYBdhLWcg3wl1F3 - rsmith54
3
只是为了回答评论中的问题(更详细的解释在链接中:[(key, gb.get_group(key)) for key in gb.groups]),我提供了一个答案。 - de1
相同的解决方案,但使用迭代器def split(df, group): gb = df.groupby(group) for g in gb.groups: yield gb.get_group(g) - Jonatas Eduardo

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

如果您只需要DataFrame的一个子集,比如只需要'NO_YLDF'系列数据,可以修改字典解析器。
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

0
你可以使用locquery来迭代唯一值并获取分组。
[df.loc[df['ZZ'] == i] for i in df['ZZ'].unique()]

或者

[df.query('ZZ == @i') for i in df['ZZ'].unique()]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接