pandas groupby agg函数column/dtype错误

zour9fqk  于 2023-09-29  发布在  其他
关注(0)|答案(1)|浏览(423)

我正在使用Python进行数据分析,并且我在Ch的一部分上遇到了问题。9(数据聚合和组操作)部分的“使用函数进行分组”。
具体来说,如果我使用GroupBy对象方法或例如Numpy定义的函数,一切都很好。特别是,它忽略包含字符串的列,只对(适当的)数字列进行操作。但是,如果我尝试定义自己的函数来计算一些数值输出,它不会忽略包含字符串的列,并且会返回一个Attribute Error。
下面是我遇到麻烦的例子:

df = DataFrame({'data1':np.random.randn(5),
                'data2':np.random.randn(5),
                'key1':['a','a','b','b','a'],
                'key2':['one','two','one','two','one']})

如果我输入以下任何一个,它都可以正常工作(我将numpy导入为np):

df.groupby('key1').mean()

grouped = df.groupby('key1')

grouped.agg(np.mean())

但是如果我尝试这些,我会得到错误('peak_to_peak'来自书中):

def peak_to_peak(arr):
    return arr.max() - arr.min()

grouped.agg(peak_to_peak)

grouped.agg(lambda x: np.mean(x))

尝试'peak_to_peak'会给我一个很大很长的错误,最后是:

TypeError: unsupported operand type(s) for -: 'str' and 'str'

使用np.mean()尝试lambda函数时,我得到了一个很长的错误,最后是:

TypeError: Could not convert onetwoone to numeric

尝试其他用户定义函数也会产生类似的错误。在所有这些情况下,很明显,它试图将peak_to_peak()或np.mean()(或其他)应用于df中的'key2'列(的子集),而对于内置方法和预定义函数,它(正确地)忽略了'key2'列子集。
任何见解将不胜感激。
更新:事实证明,如果我将'peak_to_peak'或lambda函数作为列表传递(例如,grouped.agg([peak_to_peak])),它可以正常工作。请注意,这不是书中所介绍的,也不是预定义函数所需的列表。所以,它仍然令人困惑,但至少它的功能,我想。

9jyewag0

9jyewag01#

在您使用的方法中,您将列作为参数传递给函数,一个接一个地传递所有值。但是,由于key2列中存在非数值,因此无法在两个字符串之间执行减法。
您可以按以下方式解决您的问题:

grouped[["data1", "data2"]].agg(peak_to_peak)

grouped[["data1", "data2"]].agg(lambda x: np.mean(x))`

相关问题