@@ -266,6 +266,34 @@ def _check_output(res, col, index=['A', 'B'], columns=['C']):
266266 gmarg = table [item ]['All' , '' ]
267267 self .assertEqual (gmarg , self .data [item ].mean ())
268268
269+ # issue number #8349: pivot_table with margins and dictionary aggfunc
270+
271+ df = DataFrame ([ {'JOB' :'Worker' ,'NAME' :'Bob' ,'YEAR' :2013 ,'MONTH' :12 ,'DAYS' : 3 ,'SALARY' : 17 },
272+ {'JOB' :'Employ' ,'NAME' :'Mary' ,'YEAR' :2013 ,'MONTH' :12 ,'DAYS' : 5 ,'SALARY' : 23 },
273+ {'JOB' :'Worker' ,'NAME' :'Bob' ,'YEAR' :2014 ,'MONTH' : 1 ,'DAYS' :10 ,'SALARY' :100 },
274+ {'JOB' :'Worker' ,'NAME' :'Bob' ,'YEAR' :2014 ,'MONTH' : 1 ,'DAYS' :11 ,'SALARY' :110 },
275+ {'JOB' :'Employ' ,'NAME' :'Mary' ,'YEAR' :2014 ,'MONTH' : 1 ,'DAYS' :15 ,'SALARY' :200 },
276+ {'JOB' :'Worker' ,'NAME' :'Bob' ,'YEAR' :2014 ,'MONTH' : 2 ,'DAYS' : 8 ,'SALARY' : 80 },
277+ {'JOB' :'Employ' ,'NAME' :'Mary' ,'YEAR' :2014 ,'MONTH' : 2 ,'DAYS' : 5 ,'SALARY' :190 } ])
278+
279+ df = df .set_index (['JOB' ,'NAME' ,'YEAR' ,'MONTH' ],drop = False ,append = False )
280+
281+ rs = df .pivot_table ( index = ['JOB' ,'NAME' ],
282+ columns = ['YEAR' ,'MONTH' ],
283+ values = ['DAYS' ,'SALARY' ],
284+ aggfunc = {'DAYS' :'mean' ,'SALARY' :'sum' },
285+ margins = True )
286+
287+ ex = df .pivot_table (index = ['JOB' ,'NAME' ],columns = ['YEAR' ,'MONTH' ],values = ['DAYS' ],aggfunc = 'mean' ,margins = True )
288+
289+ tm .assert_frame_equal (rs ['DAYS' ], ex ['DAYS' ])
290+
291+ ex = df .pivot_table (index = ['JOB' ,'NAME' ],columns = ['YEAR' ,'MONTH' ],values = ['SALARY' ],aggfunc = 'sum' ,margins = True )
292+
293+ tm .assert_frame_equal (rs ['SALARY' ], ex ['SALARY' ])
294+
295+
296+
269297 def test_pivot_integer_columns (self ):
270298 # caused by upstream bug in unstack
271299
0 commit comments