我正在使用Python进行数据分析,而且我遇到了部分问题。 9(数据聚合和组操作)部分关于“使用函数分组”。
具体来说,如果我使用GroupBy对象方法或者例如Numpy定义的函数,一切正常。特别是,它忽略带有字符串的列,并且只对(适当的)数字列进行操作。但是,如果我尝试定义自己的函数来计算某些数字输出,它不会忽略带有字符串的列,并返回属性错误。
以下是我遇到问题的例子:
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])),它就可以正常工作。请注意,这不是本书中的方式,也不是预定义函数所需的列表。所以,它仍然令人困惑,但我认为至少它是有用的。