编辑:
我需要从多个复杂计算中返回多个值的 apply 函数。我可以在一个元组中返回这些值,因此 groupby-apply 操作的结果将是一个以组名作为索引、元组作为值的系列。我希望它返回一个 DataFrame,所以我可以保留所有 pandas 的功能和灵活性。
一般来说,groupby-apply 操作的结果将是一个 Series 在这种情况下 apply 返回 1 个值。在应用返回 2 个或更多值的情况下,我希望结果是一个数据框。所以我的问题是如何做到这一点。有关更多详细信息和示例,请参阅原始 Q
原问:
我有一个包含许多列和组的数据框。我试图通过 groupby-apply 机制进行分组操作,并且只为每个组检索 2 个值。目前,我为每个组返回一个元组(例如return (a,b)
),因此我得到的结果是一个以组名作为索引,元组作为值的系列。
这对我来说不是最好的输出,因为我接下来需要按其中一个值进行排序,而且通常这种方式我失去了很多 DataFrame 和 Series 功能。
我想取而代之的是一个带有“a”和“b”列的数据框。
例如,假设一个大数据框 df 看起来像这样:
Out[123]:
ID1 ID2 score
0 6073165338_1 6073165338 100
1 6073165338_1 6073165338 89
2 6073165338_1 6073165338 87
3 6073165338_1 6073165338 65
4 6073165338_1 6073165338 62
我想按 ID1 对其进行分组,并为每个组返回 ID2(每个 ID1 组相同)和前 3 个条目的平均分数。我可以做这样的事情:
def calc(grp):
return grp.ID2.iloc[0],grp.score[:2].mean()
who的结果df.groupby('ID1').apply(calc)
应该是一个以 ID1 组为索引的系列,以及以 2 个元素为值的元组:
6073165338_1 (6073165338, 94.5)
我希望输出是一个具有相同索引的数据框,并且两个值作为数据框中的列,这样我就可以轻松地进行分析。
我怎么做?