首页 > 解决方案 > 我该如何解决?规范错误:不支持嵌套重命名器

问题描述

pandas 1.0 版本之后,更新了 API 的写法。原来的gropuby+agg grouping+aggregate函数写法改了,但是这个报错信息实在是让人摸不着头脑。

learners = mooc.groupby('anon_screen_name')
A_agg_learner = learners.agg(
    {
        'event_type': {
            'nbr_events': lambda x: x.count(),
            'nbr_pause_video': lambda x: (x == 'pause_video').sum(),
            'forum_thread_reply': lambda x: (x == 'thread_reply').sum(),
            'forum_comment_reply': lambda x: (x == 'comment_reply').sum(),
            'forum_thread_update': lambda x: (x == 'thread_update').sum(),
            'forum_comment_update': lambda x: (x == 'comment_update').sum(),
        },
        'nbr_session': {'nbr_sessions': lambda x: x.max() + 1},
        'resource_display_name': {
            'nbr_problem_visit': lambda x: x[x.isin(problem_name)].nunique()
        },
        'week': {'nbr_week': lambda x: x.nunique()},
    }
)
A_agg_learner.columns = A_agg_learner.columns.droplevel()
A_agg_learner.columns = A_agg_learner.columns.droplevel()

A_agg_learner['nbr_forum_post_update']=A_agg_learner.forum_thread_update +  A_agg_learner.forum_comment_update
A_agg_learner['nbr_forum_post_reply']=A_agg_learner.forum_thread_reply + A_agg_learner.forum_comment_reply
A_agg_learner['nbr_forum_post']=A_agg_learner.nbr_forum_post_update + A_agg_learner.nbr_forum_post_reply
A_agg_learner.drop('forum_thread_update', axis=1, inplace=True)
A_agg_learner.drop('forum_comment_update', axis=1, inplace=True)
A_agg_learner.drop('forum_thread_reply', axis=1, inplace=True)
A_agg_learner.drop('forum_comment_reply', axis=1, inplace=True)
A_agg_learner.drop('nbr_forum_post_reply', axis=1, inplace=True)
A_agg_learner.drop('nbr_forum_post_update', axis=1, inplace=True)

A_agg_learner.head()

错误是

Traceback (most recent call last)
      1 learners=mooc.groupby("anon_screen_name")
----> 2 A_agg_learner=learners.agg({'event_type':{
      3         'nbr_events':lambda x:x.count(),
      4         'nbr_pause_video':lambda x: (x == 'pause_video').sum(),
      5         'forum_thread_reply':lambda x: (x == 'thread_reply').sum(),

~\anaconda3\lib\site-packages\pandas\core\groupby\generic.py in aggregate(self, func, *args, **kwargs)
    926         func = _maybe_mangle_lambdas(func)
    927 
--> 928         result, how = self._aggregate(func, *args, **kwargs)
    929         if how is None:
    930             return result

~\anaconda3\lib\site-packages\pandas\core\base.py in _aggregate(self, arg, *args, **kwargs)
    340                     # {'ra' : { 'A' : 'mean' }}
    341                     if isinstance(v, dict):
--> 342                         raise SpecificationError("nested renamer is not supported")
    343                     elif isinstance(obj, ABCSeries):
    344                         raise SpecificationError("nested renamer is not supported")

SpecificationError: nested renamer is not supported

“anon_screen_name”示例是

,anon_screen_name,week,event_type,resource_display_name,time,event_duration,nbr_session,success,video_code,video_current_time,video_speed,video_old_time,video_new_time,video_seek_type,video_new_speed,video_old_speed,goto_from,goto_dest,ip_country,events
0,9a3d3f219e4cc1122e929e2daa4a7afcfc6ec2d9,,about,,2015-01-19 00:02:43,65913.0,0,,,,,,,,,,-1,-1.0,GBR,about
1,d39809aa673c09a836815d09b44f7ca9c9bed463,,about,,2015-01-19 00:02:49,44.0,0,,,,,,,,,,-1,-1.0,ITA,about
2,d39809aa673c09a836815d09b44f7ca9c9bed463,,edx.course.enrollment.activated,,2015-01-19 00:03:33,71802.0,0,,,,,,,,,,-1,-1.0,ITA,edx.course.enrollment.activated
3,34a807d69e6169b69c21572dbc45524b4384aadf,,about,,2015-01-19 00:03:44,170.0,0,,,,,,,,,,-1,-1.0,EGY,about
4,34a807d69e6169b69c21572dbc45524b4384aadf,,about,,2015-01-19 00:06:34,19450.0,0,,,,,,,,,,-1,-1.0,EGY,about
5,ee832c53a99187e34ddaa042c7514fa6e03489bd,,about,,2015-01-19 00:08:41,147.0,0,,,,,,,,,,-1,-1.0,POL,about

原始代码运行结果示例

在此处输入图像描述

标签: pythonpandasaggregate

解决方案


A_agg_learner=mooc.groupby("anon_screen_name").agg({'event_type':[
            lambda x: x.count(),
            lambda x: (x == 'pause_video').sum(),
            lambda x: (x == 'thread_reply').sum(),
            lambda x: (x == 'comment_reply').sum(),
            lambda x: (x == 'thread_update').sum(),
            lambda x: (x == 'comment_update').sum(),
],
      'week':  lambda x:x.nunique(),
      'nbr_session': lambda x: x.max() + 1,
      'resource_display_name': lambda x: x[x.isin(problem_name)].nunique()      
                                                   })
A_agg_learner.columns = A_agg_learner.columns.droplevel()
A_agg_learner.columns = ['nbr_events', 'nbr_pause_video','forum_thread_reply','forum_comment_reply','forum_thread_update','forum_comment_update','nbr_week','nbr_sessions','nbr_problem_visit']

A_agg_learner['nbr_forum_post_update']=A_agg_learner.forum_thread_update +  A_agg_learner.forum_comment_update
A_agg_learner['nbr_forum_post_reply']=A_agg_learner.forum_thread_reply + A_agg_learner.forum_comment_reply
A_agg_learner['nbr_forum_post']=A_agg_learner.nbr_forum_post_update + A_agg_learner.nbr_forum_post_reply
A_agg_learner.drop('forum_thread_update', axis=1, inplace=True)
A_agg_learner.drop('forum_comment_update', axis=1, inplace=True)
A_agg_learner.drop('forum_thread_reply', axis=1, inplace=True)
A_agg_learner.drop('forum_comment_reply', axis=1, inplace=True)
A_agg_learner.drop('nbr_forum_post_reply', axis=1, inplace=True)
A_agg_learner.drop('nbr_forum_post_update', axis=1, inplace=True)

# ActiveLS=A_agg_learner
A_agg_learner.head()

推荐阅读