我们可以考虑将两种类型的函数应用于 Pandas 系列:转换和聚合。他们在文档中做出了这种区分;转换映射系列中的单个值,而聚合以某种方式总结整个系列(例如平均值)。
apply
很清楚如何使用aggregation
. 请注意,groupby
不涉及,并且聚合不需要groupby
.
我正在处理以下情况:我有一个Series
其中每一行都是字符串列表。我可以聚合这些数据的一种方法是计算每个字符串的出现次数,并返回 5 个最常见的术语。
def top_five_strings(series):
counter = {}
for row in series:
for s in row:
if s in counter:
counter[s] += 1
else:
counter[s] = 1
return sorted(s.items(), key=lambda x: x[1])[:5]
如果我将此函数称为top_five_strings(series)
,它可以正常工作,就像我调用np.mean(series)
了一个数字系列一样。但是,不同之处在于我也可以做到series.agg(np.mean)
并得到相同的结果。如果我这样做series.agg(top_five_strings)
,我会得到 Series 每一行中的前五个字母(如果你将单行作为函数的参数,这很有意义)。
我认为关键的区别在于它np.mean
是 NumPy ufunc
,但我无法弄清楚_aggregate
帮助函数在 Pandas 源代码中的工作原理。
我剩下两个问题:
1)我可以通过使我的 Python 函数成为一个ufunc
(如果可以,如何)来实现这一点?
2)这是一件愚蠢的事情吗?我还没有发现其他人试图做这样的事情。然而,在我看来,能够在 Pandas 框架内实现自定义聚合以及自定义转换(例如,我得到一个 Series 作为结果,就像使用df.describe
.