将自定义聚合函数应用于数据帧

2024-05-17 19:44:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有两个浮点列的pandas数据帧,col_xcol_y

我想返回col_x * col_y之和除以col_x之和

这可以通过自定义聚合函数来完成吗

我正在尝试这样做:

import pandas as pd


def aggregation_function(x, y):
    return sum(x * y) / sum(x)


df = pd.DataFrame([(0.1, 0.2), (0.3, 0.4), (0.5, 0.6)], columns=["col_x", "col_y"])
result = df.agg(aggregation_function, axis="columns", args=("col_x", "col_y"))

我知道聚合函数可能没有意义,但我甚至无法尝试其他方法,因为我遇到了以下错误:

TypeError: apply() got multiple values for keyword argument 'args'

我不知道如何为我的聚合函数指定args。我也尝试过使用kwargs,但我所做的一切都不管用。在{a1}中没有这方面的例子,但似乎说这是可能的

如何为聚合函数指定参数

输出聚合的预期结果将是单个值


Tags: columns数据函数importpandasdfdefas
1条回答
网友
1楼 · 发布于 2024-05-17 19:44:51

首先,您可以在axis=1上使用apply来解决此类问题:

df.apply(lambda x: aggregation_function(x['col_x'],x['col_y']),axis=1)

但是,在您的案例中,这将导致错误,因为您拥有的聚合函数正在为每一行计算col_x * col_y,sum不适用于标量值,它需要一个iterable:

Signature: sum(iterable, start=0, /) Docstring: Return the sum of a 'start' value (default: 0) plus an iterable of numbers

因此sum(0.2)不起作用

如果我们从聚合函数中移除总和,这将按预期工作:

def aggregation_function(x, y):return (x * y)/ x
df.apply(lambda x: aggregation_function(x['col_x'],x['col_y']),axis=1)

0    0.2
1    0.4
2    0.6
dtype: float64

然而,正如您所说,您希望将col_x之和除以col_xcol_y的乘法结果,您可以调整函数并使用series.sum直接与数据帧一起使用,尽管这可以向量化为df['col_x'].mul(df['col_y']).sum()/df['col_x'].sum()

def aggregation_function(x, y): return (x * y).sum() / x.sum()
aggregation_function(df['col_x'],df['col_y'])

0.4888888888888889

相关问题 更多 >