我现在正在处理一个相对奇怪的架构,我可能会收到一个按对象分组(在应用聚合函数之前),但无法实际看到生成它的操作或数据帧。我需要以某种方式从 groupby 对象本身恢复该信息。对我来说,直觉上该信息必须保存在 groupby 对象中的某个位置,但我在文档中看不到如何访问它。有谁有任何信息可以帮助我吗?
我尝试查看按对象分组的文档,以及使用
.head()
函数按对象分组。我想恢复底层数据帧的列以及分组的列。
假设
df_gby
是您的输入,并且从我在源代码中可以读到的内容来看,GroupBy
类继承自 BaseGroupBy
,后者可以使用 grouper
属性进行访问,该属性提供对分组信息(包括组names
):
df_gby = pd._testing.makeMixedDataFrame().groupby(["A", "B"])
>>> type(df_gby)
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000017665493250>
>>> type(df_gby.grouper)
pandas.core.groupby.ops.BaseGrouper
>>> df_gby.grouper.names
['A', 'B']
要获取所有列名称,您可以使用:
>>> df_gby.obj.columns
Index(['A', 'B', 'C', 'D'], dtype='object')
使用的数据框:
A B C D
0 0.0 0.0 foo1 2009-01-01
1 1.0 1.0 foo2 2009-01-02
2 2.0 0.0 foo3 2009-01-05
3 3.0 1.0 foo4 2009-01-06
4 4.0 0.0 foo5 2009-01-07
您可以使用
pd.concat
返回所有组的单个数据帧,循环遍历每个组以及 .indices
:
data = pd.concat(
[v.reset_index(drop=False).set_index(idx_array)
for (k, v), (g, idx_array) in zip(grouped, grouped.indices.items())]
).sort_index()
这结合了组和原始索引,因此未分组数据帧的初始顺序不会丢失。
事实上,可以在here找到一个更简单的答案,作者:@Andy L.:
grouped.head(grouped.ngroup().size)