我正在学习《Python数据分析》一书,目前在第9章(数据聚合和分组操作)中遇到了“使用函数进行分组”一节的问题。
具体来说,如果我使用GroupBy对象方法或例如由Numpy定义的函数,一切都正常。特别是它会忽略包含字符串的列,只处理(适当的)数值列。然而,如果我尝试定义自己的函数来计算一些数值输出,它不会忽略包含字符串的列,并返回一个属性错误。
以下是我遇到困难的示例:
尝试使用“peak_to_peak”时,出现了一个大而长的错误,最后以以下内容结束:
尝试其他用户定义的函数会产生类似的错误。在所有这些情况下,很明显它试图将peak_to_peak()或np.mean()(或其他函数)应用于df的“key2”列(子集),而对于内置方法和预定义函数,它(正确地)忽略了“key2”列子集。欢迎任何见解。
更新:事实证明,如果我将'peak_to_peak'或lambda函数作为列表传递(例如,grouped.agg([peak_to_peak])),它可以正常工作。请注意,这不是书中所呈现的方式,也不需要预定义函数使用列表。因此,仍然令人困惑,但至少是可行的。
具体来说,如果我使用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])),它可以正常工作。请注意,这不是书中所呈现的方式,也不需要预定义函数使用列表。因此,仍然令人困惑,但至少是可行的。
.agg(lambda x: np.mean(x))
我在key2列中得到了NaN值。关于agg
的文档根本没有提到这一点,但是应该提到。愿意在github上开一个问题吗? - undefined