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

标签 python pandas

编辑:

我需要从多个复杂计算中返回多个值的应用函数。我可以在一个元组中返回这些值,因此 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/

相关文章:

python - 使用 easymoney 和 pandas 进行货币转换

python - 具有类似于 Python/NumPy 的数组操作的 C++ 库

python - 使用python 3从网页抓取数据,需要先登录

Pandas 数据帧 : remove � (unknown-character) from strings in rows

python - 在 pandas 上添加新行?

python - 生成多个 Pandas 数据框

python - 如何避免 python 在屏蔽数据后使用 UserWarning 进行隐式修复

Python+MySQL - 批量插入

python - 如何在 python 中通过键盘输入继续 for 循环?

Python:有条件地设置变量的最惯用方法?