我正在使用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])),它可以正常工作。请注意,这不是书中所介绍的,也不是预定义函数所需的列表。所以,它仍然令人困惑,但至少它的功能,我想。
1条答案
按热度按时间9jyewag01#
在您使用的方法中,您将列作为参数传递给函数,一个接一个地传递所有值。但是,由于key2列中存在非数值,因此无法在两个字符串之间执行减法。
您可以按以下方式解决您的问题: