如果在 pandas 中编写要与 groupby.apply 或 groupby.transform 一起使用的函数,如果函数有多个参数,那么当作为 groupby 的一部分调用该函数时,参数后面是逗号而不是括号。一个例子是:
def Transfunc(df, arg1, arg2, arg2):
return something
GroupedData.transform(Transfunc, arg1, arg2, arg3)
其中 df 参数作为第一个参数自动传递。
但是,在使用函数对数据进行分组时,似乎无法使用相同的语法。举个例子:
people = DataFrame(np.random.randn(5, 5), columns=['a', 'b', 'c', 'd', 'e'], index=['Joe', 'Steve', 'Wes', 'Jim', 'Travis'])
people.ix[2:3, ['b', 'c']] = NA
def MeanPosition(Ind, df, Column):
if df[Column][Ind] >= np.mean(df[Column]):
return 'Greater Group'
else:
return 'Lesser Group'
# This function compares each data point in column 'a' to the mean of column 'a' and return a group name based on whether it is greater than or less than the mean
people.groupby(lambda x: MeanPosition(x, people, 'a')).mean()
上面的工作很好,但我不明白为什么我必须将函数包装在 lambda 中。根据与 transform 和 apply 一起使用的语法,在我看来,以下内容应该可以正常工作:
people.groupby(MeanPosition, people, 'a').mean()
谁能告诉我为什么,或者如何在不将其包装在 lambda 中的情况下调用该函数?
谢谢
编辑:我认为不可能通过将函数作为键传递而不将该函数包装在 lambda 中来对数据进行分组。一种可能的解决方法是传递一个由函数创建的数组,而不是将函数作为键传递。这将通过以下方式工作:
def MeanPositionList(df, Column):
return ['Greater Group' if df[Column][row] >= np.mean(df[Column]) else 'Lesser Group' for row in df.index]
Grouped = people.groupby(np.array(MeanPositionList(people, 'a')))
Grouped.mean()
但是当然最好把中间人函数全部去掉,然后简单地使用一个带有列表理解的数组......