有没有一种内置的pandas方法可以将两个不同的聚合函数f1, f2
应用到同一列df["returns"]
,而不必多次调用agg()
?
示例 Dataframe :
import pandas as pd
import datetime as dt
import numpy as np
pd.np.random.seed(0)
df = pd.DataFrame({
"date" : [dt.date(2012, x, 1) for x in range(1, 11)],
"returns" : 0.05 * np.random.randn(10),
"dummy" : np.repeat(1, 10)
})
语法上错误但直觉上正确的方法是:
# Assume `f1` and `f2` are defined for aggregating.
df.groupby("dummy").agg({"returns": f1, "returns": f2})
显然,Python不允许重复的键。有没有其他方式来表达agg()
的输入?也许元组列表[(column, function)]
会更好,允许多个函数应用于同一列?但是agg()
似乎只接受字典。
除了定义一个辅助函数来应用其中的两个函数之外,有没有其他解决方法?(这将如何与聚合一起工作?)
4条答案
按热度按时间gudnpqoy1#
截至2022-06-20,以下是聚合的公认做法:
请参阅this answer了解更多信息。
下面是
pandas
的历史版本。你可以简单地将函数作为列表传递:
或者作为字典:
3lxsmp7m2#
TLDR; Pandas
groupby.agg
有一个新的、更简单的语法来指定(1)多列上的聚合,以及(2)一列上的多个聚合。或
Pandas〉= 0.25:命名聚合
Pandas改变了
GroupBy.agg
的行为,支持更直观的语法来指定命名聚合。请参阅0.25文档中关于增强功能以及相关GitHub问题GH18366和GH26512的部分。从文件来看,
为了支持特定于列的聚合,并控制输出列名,pandas接受
GroupBy.agg()
中的特殊语法,称为“命名聚合”,其中现在可以通过关键字参数传递元组。元组遵循
(<colName>, <aggFunc>)
。或者,您可以使用
pd.NamedAgg
(本质上是一个namedtuple),这使得事情更加明确。对于Series来说更简单,只需将aggfunc传递给关键字参数。
最后,如果你的列名不是有效的python标识符,请使用解包的字典:
Pandas〈0.25
在pandas 0.24之前的最新版本中,如果使用字典为聚合输出指定列名,您将得到
FutureWarning
:在v0.20中不建议使用字典来重命名列。在最近的pandas版本中,可以通过传递一个元组列表来更简单地指定这一点。如果以这种方式指定函数,则该列的 * 所有 * 函数需要指定为(name,function)对的元组。
或者
j8yoct9x3#
像这样的工作:
kjthegm64#
如果您有多个列需要应用相同的多个聚合函数,最简单的方法(imo)是使用字典解析。
上面的结果是一个带有MultiIndex列的 Dataframe 。如果需要一个扁平的自定义列名,命名聚合是一种方法(正如这里的其他答案所建议的那样)。
如文档中所述,对于命名聚合,键应该是输出列名,值应该是元组
(column, aggregation function)
。由于有多个列和多个函数,这导致了嵌套结构。要将其扁平化为单个字典,可以使用collections.ChainMap()
或嵌套循环。此外,如果您更喜欢将分组器列(
dummy
)作为列(而不是索引),请在groupby()
中指定as_index=False
。