Funciones de llamada con múltiples argumentos cuando se usa Groupby

Cuando se escriben funciones para ser utilizadas con groupby.apply o groupby.transform en pandas si las funciones tienen múltiples argumentos, al llamar a la función como parte de groupby los argumentos siguen una coma en lugar de entre paréntesis. Un ejemplo sería:

def Transfunc(df, arg1, arg2, arg2): return something GroupedData.transform(Transfunc, arg1, arg2, arg3) 

Donde el argumento df se pasa automáticamente como el primer argumento.

Sin embargo, la misma syntax no parece ser posible cuando se usa una función para agrupar los datos. Tomemos el siguiente ejemplo:

 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() 

Lo anterior funciona bien, pero no entiendo por qué tengo que envolver la función en un lambda. Según la syntax utilizada con la transformación y la aplicación, me parece que lo siguiente debería funcionar bien:

 people.groupby(MeanPosition, people, 'a').mean() 

¿Puede alguien decirme por qué o cómo puedo llamar a la función sin envolverla en un lambda?

Gracias

EDITAR: No creo que sea posible agrupar los datos pasando una función como la clave sin envolver esa función en un lambda. Una posible solución es, en lugar de pasar una función como la clave, pasar una matriz que ha sido creada por una función. Esto funcionaría de la siguiente manera:

 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() 

Pero, por supuesto, podría ser mejor simplemente cortar la función de intermediario todos juntos y simplemente usar una matriz con la comprensión de la lista …

Pasar argumentos para apply simplemente funciona, porque apply pasa todos los argumentos a la función de destino.

Sin embargo, groupby toma múltiples argumentos, vea aquí , por lo que no es posible diferenciar entre argumentos; Pasar una función lambda / nombrada es más explícito y el camino a seguir.

Aquí es cómo hacer lo que creo que quieres (ligeramente modificado, ya que tienes todos los grupos distintos en tu ejemplo)

 In [22]: def f(x): ....: result = Series('Greater',index=x.index) ....: result[x