Pandas Groupby Agg函数列/数据类型错误

3
我正在学习《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])),它可以正常工作。请注意,这不是书中所呈现的方式,也不需要预定义函数使用列表。因此,仍然令人困惑,但至少是可行的。

1
你正在使用pandas的哪个版本?在最新的master上,对于.agg(lambda x: np.mean(x))我在key2列中得到了NaN值。关于agg的文档根本没有提到这一点,但是应该提到。愿意在github上开一个问题吗? - undefined
我有pandas 0.13.1(还有numpy 1.7.1和python 2.7.6,不过这些可能没什么用)。我在我的代码中没有看到任何NaN值...我会考虑在GitHub上提交一个问题。感谢您的回复。 - undefined
这是从0.13之前的一个回归问题,不确定具体是什么时候(据我所知,该书基于大约0.10版本);在这里修复了。https://github.com/pydata/pandas/pull/6338;它应该基本上忽略那一列(之前只是没有捕捉到错误)。 - undefined
1个回答

0
在你使用的方法中,你将列作为参数逐个传递给函数,并且包含所有的值。然而,由于key2列中存在非数字值,所以无法对两个字符串进行减法运算。
你可以按照以下方式解决这个问题:
grouped[["data1", "data2"]].agg(peak_to_peak)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接