使用 '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]
由于一行代码比较长(用了3lambda
s!),最好单独包装在一个函数中,如下所示:
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
),结果将不准确。
我想获取 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]
由于一行代码比较长(用了3lambda
s!),最好单独包装在一个函数中,如下所示:
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
),结果将不准确。