How can I solve? SpecificationError: nested renamer is not supported

Viewed 169

After pandas version 1.0, the API writing method has been updated. The original gropuby+agg grouping+aggregate function writing method has been changed, but this error message is really confusing.

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

The error is

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" example is

,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

Example of original code running result

enter image description here

1 Answers
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()
Related