gpt4 book ai didi

python - 从多返回值 groupby-apply 操作输出 DataFrame 而不是 Series

转载 作者:行者123 更新时间:2023-11-28 18:46:17 27 4
gpt4 key购买 nike

编辑:

我需要从多个复杂计算中返回多个值的应用函数。我可以在一个元组中返回这些值,因此 groupby-apply 操作的结果将是一个系列,其中组名作为索引,元组作为值。我希望它返回一个 DataFrame,这样我就可以保留所有 pandas 的功能和灵 active 。

一般来说,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()

df.groupby('ID1').apply(calc) 的结果应该是一个以 ID1 组为索引、以 2 个元素为值的元组的系列:

6073165338_1 (6073165338, 94.5)

我希望输出是一个数据框,它具有相同的索引和两个值作为数据框中的列,这样我就可以轻松地进行分析。

我该怎么做?

最佳答案

好的,我有两个解决方案。第一个可能更好,但我仍然希望专家发表评论。第一个选项是让应用函数返回一个元组,然后将元组系列转换为 DataFrame:

s = x.groupby('ID1').apply(calc)
DataFrame(s.tolist(),index = s.index,columns = ['ID2','top3avg'])

这导致:

Out[156]:
ID2 top3avg
ID1
6073165338_1 6073165338 94.5

第二个是在返回的元组上使用数据帧构造函数返回数据帧:

def calc(grp):
return DataFrame([(grp.ID2.iloc[0],grp.score[:2].mean())],columns=['ID2','top3avg'])

x.groupby('ID1').apply(calc) 的结果现在是一个数据帧:

                         ID2    top3avg
ID1
6073165338_1 0 6073165338 94.5

第一个选项似乎更好,因为:

  1. 它只在 groupby-apply 操作结束时运行 DF 构造函数一次
  2. 它不返回不必要的整数索引。

关于python - 从多返回值 groupby-apply 操作输出 DataFrame 而不是 Series,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19546507/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com