29

是否可以指定groupby()调用在apply()lambda 函数中使用组名?

类似于如果我遍历组,我可以通过以下元组分解获得组键:

for group_name, subdf in temp_dataframe.groupby(level=0, axis=0):
    print group_name

...有没有办法在 apply 函数中获取组名,例如:

temp_dataframe.groupby(level=0,axis=0).apply(lambda group_name, subdf: foo(group_name, subdf)

如何获取组名作为 apply lambda 函数的参数?

4

2 回答 2

45

我认为您应该能够使用该name属性:

temp_dataframe.groupby(level=0,axis=0).apply(lambda x: foo(x.name, x))

应该工作,例如:

In [132]:
df = pd.DataFrame({'a':list('aabccc'), 'b':np.arange(6)})
df

Out[132]:
   a  b
0  a  0
1  a  1
2  b  2
3  c  3
4  c  4
5  c  5

In [134]:
df.groupby('a').apply(lambda x: print('name:', x.name, '\nsubdf:',x))

name: a 
subdf:    a  b
0  a  0
1  a  1
name: b 
subdf:    a  b
2  b  2
name: c 
subdf:    a  b
3  c  3
4  c  4
5  c  5
Out[134]:
Empty DataFrame
Columns: []
Index: []
于 2015-09-08T14:48:02.063 回答
6

对于那些来寻找问题答案的人:

在转换函数 pandas python中包含组名

并最终出现在这个线程中,请继续阅读。

给定以下输入:

df = pd.DataFrame(data={'col1': list('aabccc'),
                        'col2': np.arange(6),
                        'col3': np.arange(6)})

数据:

    col1    col2    col3
0   a       0       0
1   a       1       1
2   b       2       2
3   c       3       3
4   c       4       4
5   c       5       5

我们可以像这样访问组名(从调用apply函数的范围内可见):

df.groupby('col1') \
.apply(lambda frame: frame \
       .transform(lambda col: col + 3 if frame.name == 'a' and col.name == 'col2' else col))

输出:

    col1    col2    col3
0   a       3       0
1   a       4       1
2   b       2       2
3   c       3       3
4   c       4       4
5   c       5       5

请注意,需要调用 apply 以获得对子 pandas.core.frame.DataFrame(即帧)的引用,该子帧包含相应子组的 name 属性。transform 的参数(即 col)的 name 属性是指列/系列名称。

或者,也可以循环遍历组,然后在每个组中遍历列:

for grp_name, sub_df in df.groupby('col1'):
    for col in sub_df:
        if grp_name == 'a' and col == 'col2':
            df.loc[df.col1 == grp_name, col] = sub_df[col] + 3

我的用例很少见,这是实现我的目标的唯一方法(截至 pandas v0.24.2)。但是,我建议彻底探索 pandas 文档,因为对于您可能需要此构造的内容,很可能有一个更简单的矢量化解决方案。

于 2019-04-26T13:51:09.450 回答