将DataFrameGroupBy对象转换为DataFrame pandas

52

我有一个数据帧,并在 FIPS 上进行了分组,然后对这些组求和,效果很好。

kl = ks.groupby('FIPS')

kl.aggregate(np.sum)

我只想要一个正常的Dataframe,但是我得到了一个pandas.core.groupby.DataFrameGroupBy对象。


14
问题标题表明这个问题是关于如何将一个groupby对象通常转换回数据帧,但实际上这个问题和被接受的答案只涉及特定情况(sum聚合)。如果问题和被接受的答案都是关于如何将一个groupby对象通常转换为数据帧而没有对其进行任何数字处理,它们将更加有用。请注意保持原意,使语言易懂,不要添加解释或其他内容。 - Alex
要将组作为数据框获取,请使用类似于以下内容的语句 ks.groupby('FIPS').get_group("无论您拥有哪些groupby值")。 - mahmoh
4个回答

29
 df_g.apply(lambda x: x) 

将返回原始数据框。


17
为什么需要这个? - cs95
这仍然返回DFGroupby。 - hungryMind
2
@C.K. 我明白了,谢谢。然而,我的观点更多地是关于为什么我们需要这个方法来返回原始的DataFrame,如果df_g本身就是原始的DataFrame呢?如果这是关于apply做什么以及如何将函数应用到每个组的问题,那就另开一篇讨论吧。2c - cs95
1
@cs95 是的,你说得对。我在看到这个答案时第一时间就投了你的评论,因为我认为一定有更简单的方法,比如 grouped.to_df()。然而,当我查看了 GroupBy 对象的 API 后,发现并没有这样的函数,所以我回来告诉大家这是最简单的方法。哈哈。 - C.K.
回答@cs95,我只能说我为什么要寻找这个问题:这对我很必要,以便找到分组是如何改变索引的,或者在分组之后可视化缩小了什么。通常情况下,这发生在我需要处理一个嵌套层次很深的多重索引或想要对已经分组的数据框执行分组操作时。我想这是切片的一种捷径,但作为一个新用户来说,掌握多重索引切片,寻找正确的方法是非常必要的。 - double0darbo
显示剩余2条评论

24

kl.aggregate(np.sum) 的结果是一个正常的 DataFrame,你只需要将其分配给一个变量以进一步使用。举个例子:

假设有一些随机数据:

>>> df = DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
>>>                         'foo', 'bar', 'foo', 'foo'],
...                  'B' : ['one', 'one', 'two', 'three',
...                         'two', 'two', 'one', 'three'],
...                  'C' : randn(8), 'D' : randn(8)})
>>> grouped = df.groupby('A')
>>> grouped
<pandas.core.groupby.DataFrameGroupBy object at 0x04E2F630>
>>> test = grouped.aggregate(np.sum)
>>> test
            C         D
A                      
bar -1.852376  2.204224
foo -3.398196 -0.045082

2
实际上,许多DataFrameGroupBy对象方法(如apply、transform、aggregate、head、first、last)返回一个DataFrame对象。我在博客文章中使用了filter方法。 - Ken D
3
这不是一个完全正常的DataFrame。例如,如果你试图在一个GroupBy对象上调用.info()方法,你会得到一个"AttributeError: Cannot access callable attribute 'info' of 'DataFrameGroupBy' objects, try using the 'apply' method."的错误提示。 - Adrian Keister
3
调用 .reset_index() 将分组后的索引转换为列。 - hungryMind
+1 @hungryMind - 就是答案。关于Joris的回答 - 它可能是一个“数据框架”,但它不是正常的 - 你可以看到它具有不同的列分组A与C和D,这会导致在使用作为正常数据框架时绘图等操作失败。需要使用.reset_index()来折叠它以使其正确! - TickboxPhil
kl.count() 返回一个 DataFrame。 - vkt
似乎有一个未记录的属性.obj,其中包含应用了分组转换的原始对象。请参见https://dev59.com/ZWIj5IYBdhLWcg3wkl2U#66879388。还提出了一个Pandas功能请求,截至本文撰写时仍然保持开放状态:https://github.com/pandas-dev/pandas/issues/43902。 - Wolfram Arnold

1
使用 pd.concat,就像这样:
   pd.concat(map(lambda x: x[1], groups))

或者也可以保留 index 的对齐:

   pd.concat(map(lambda x: x[1], groups)).sort_index()

0

您可以使用 `.head('# of rows')` 将 `groupby` 的结果输出到一个变量中。

例如:df2 = grouped.head(100)

现在您已经有了一个包含所有分组数据的 Pandas 数据框 "df2"。


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