使用 'df.groupby(column).apply()' 在 'apply' 上下文中获取 groupby 列时?

When using 'df.groupby(column).apply()' get the groupby column within the 'apply' context?

我想获取 groupby 列,即在出现的 apply 上下文中作为 by 参数(即 df.groupby(by=column))提供给 df.groupby 的列在 groupby 之后(即 df.groupby(by=column).apply(Here))。

例如,

df = pd.DataFrame({'Animal': ['Falcon', 'Falcon',
                              'Parrot', 'Parrot'],
                   'Max Speed': [380., 370., 24., 26.]})
df.groupby(['Animal']).apply(Here I want to know that groupby column is 'Animal')
df
   Animal  Max Speed
0  Falcon      380.0
1  Falcon      370.0
2  Parrot       24.0
3  Parrot       26.0

当然,我可以再写一行代码,或者只需将 groupby 列单独提供给 apply 上下文(例如 .apply(lambda df_: some_function(df_,s='Animal')) ),但我很好奇看看这是否可以在一行中完成,例如可能使用为此构建的 pandas 函数。

您可以使用 grouper.names:

>>> df.groupby('Animal').grouper.names
['Animal']
>>> 

apply:

grouped = df.groupby('Animal')
grouped.apply(lambda x: grouped.grouper.names)

我刚刚想出了一个单行解决方案:

df = pd.DataFrame({'Animal': ['Falcon', 'Falcon',
                              'Parrot', 'Parrot'],
                   'Max Speed': [380., 370., 24., 26.]})
df.groupby(['Animal']).apply(lambda df_: df_.apply(lambda x: all(x==df_.name)).loc[lambda x: x].index.tolist())

returns 每个 groupby.apply 上下文中的 groupby 列。

Animal
Falcon    [Animal]
Parrot    [Animal]

由于一行代码比较长(用了3lambdas!),最好单独包装在一个函数中,如下所示:

def get_groupby_column(df_): return df_.apply(lambda x: all(x==df_.name)).loc[lambda x: x].index.tolist()
df.groupby(['Animal']).apply(get_groupby_column)

注意事项:如果数据框的其他列也包含 groupby 列中的项目,则此解决方案将不适用,例如如果 Max Speed 列包含 groupby 列中的任何项目(即 Animal),结果将不准确。