我们可以考虑将两种类型的函数应用于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)
,我会在系列的每一行中得到前五个字母(如果你将一行作为函数的参数,这是有意义的。)
我认为关键的区别是np.mean
是NumPy ufunc
,但我无法弄清楚_aggregate
辅助函数在Pandas源中是如何工作的。< / p>
我留下两个问题:
1)我可以通过将我的Python函数设为ufunc
(如果是,如何)来实现这一点吗?
2)这是一件愚蠢的事吗?我还没有找到其他人试图做这样的事情。在我看来,能够在Pandas框架内实现自定义聚合以及自定义转换是非常好的(例如,我可以使用df.describe
得到一个系列结果。)< / p>