编辑:
我需要从多个复杂计算中返回多个值的应用函数。我可以在一个元组中返回这些值,因此 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
第一个选项似乎更好,因为:
- 它只在 groupby-apply 操作结束时运行 DF 构造函数一次
- 它不返回不必要的整数索引。
关于python - 从多返回值 groupby-apply 操作输出 DataFrame 而不是 Series,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19546507/