@@ -371,6 +371,89 @@ def test_pivot_periods(self):
371371 pv = df .pivot (index = 'p1' , columns = 'p2' , values = 'data1' )
372372 tm .assert_frame_equal (pv , expected )
373373
374+ @pytest .mark .parametrize ('values' , [
375+ ['baz' , 'zoo' ], np .array (['baz' , 'zoo' ]),
376+ pd .Series (['baz' , 'zoo' ]), pd .Index (['baz' , 'zoo' ])
377+ ])
378+ def test_pivot_with_list_like_values (self , values ):
379+ # issue #17160
380+ df = pd .DataFrame ({'foo' : ['one' , 'one' , 'one' , 'two' , 'two' , 'two' ],
381+ 'bar' : ['A' , 'B' , 'C' , 'A' , 'B' , 'C' ],
382+ 'baz' : [1 , 2 , 3 , 4 , 5 , 6 ],
383+ 'zoo' : ['x' , 'y' , 'z' , 'q' , 'w' , 't' ]})
384+
385+ result = df .pivot (index = 'foo' , columns = 'bar' , values = values )
386+
387+ data = [[1 , 2 , 3 , 'x' , 'y' , 'z' ],
388+ [4 , 5 , 6 , 'q' , 'w' , 't' ]]
389+ index = Index (data = ['one' , 'two' ], name = 'foo' )
390+ columns = MultiIndex (levels = [['baz' , 'zoo' ], ['A' , 'B' , 'C' ]],
391+ labels = [[0 , 0 , 0 , 1 , 1 , 1 ], [0 , 1 , 2 , 0 , 1 , 2 ]],
392+ names = [None , 'bar' ])
393+ expected = DataFrame (data = data , index = index ,
394+ columns = columns , dtype = 'object' )
395+ tm .assert_frame_equal (result , expected )
396+
397+ @pytest .mark .parametrize ('values' , [
398+ ['bar' , 'baz' ], np .array (['bar' , 'baz' ]),
399+ pd .Series (['bar' , 'baz' ]), pd .Index (['bar' , 'baz' ])
400+ ])
401+ def test_pivot_with_list_like_values_nans (self , values ):
402+ # issue #17160
403+ df = pd .DataFrame ({'foo' : ['one' , 'one' , 'one' , 'two' , 'two' , 'two' ],
404+ 'bar' : ['A' , 'B' , 'C' , 'A' , 'B' , 'C' ],
405+ 'baz' : [1 , 2 , 3 , 4 , 5 , 6 ],
406+ 'zoo' : ['x' , 'y' , 'z' , 'q' , 'w' , 't' ]})
407+
408+ result = df .pivot (index = 'zoo' , columns = 'foo' , values = values )
409+
410+ data = [[np .nan , 'A' , np .nan , 4 ],
411+ [np .nan , 'C' , np .nan , 6 ],
412+ [np .nan , 'B' , np .nan , 5 ],
413+ ['A' , np .nan , 1 , np .nan ],
414+ ['B' , np .nan , 2 , np .nan ],
415+ ['C' , np .nan , 3 , np .nan ]]
416+ index = Index (data = ['q' , 't' , 'w' , 'x' , 'y' , 'z' ], name = 'zoo' )
417+ columns = MultiIndex (levels = [['bar' , 'baz' ], ['one' , 'two' ]],
418+ labels = [[0 , 0 , 1 , 1 ], [0 , 1 , 0 , 1 ]],
419+ names = [None , 'foo' ])
420+ expected = DataFrame (data = data , index = index ,
421+ columns = columns , dtype = 'object' )
422+ tm .assert_frame_equal (result , expected )
423+
424+ @pytest .mark .xfail (reason = 'MultiIndexed unstack with tuple names fails'
425+ 'with KeyError #19966' )
426+ def test_pivot_with_multiindex (self ):
427+ # issue #17160
428+ index = Index (data = [0 , 1 , 2 , 3 , 4 , 5 ])
429+ data = [['one' , 'A' , 1 , 'x' ],
430+ ['one' , 'B' , 2 , 'y' ],
431+ ['one' , 'C' , 3 , 'z' ],
432+ ['two' , 'A' , 4 , 'q' ],
433+ ['two' , 'B' , 5 , 'w' ],
434+ ['two' , 'C' , 6 , 't' ]]
435+ columns = MultiIndex (levels = [['bar' , 'baz' ], ['first' , 'second' ]],
436+ labels = [[0 , 0 , 1 , 1 ], [0 , 1 , 0 , 1 ]])
437+ df = DataFrame (data = data , index = index , columns = columns , dtype = 'object' )
438+ result = df .pivot (index = ('bar' , 'first' ), columns = ('bar' , 'second' ),
439+ values = ('baz' , 'first' ))
440+
441+ data = {'A' : Series ([1 , 4 ], index = ['one' , 'two' ]),
442+ 'B' : Series ([2 , 5 ], index = ['one' , 'two' ]),
443+ 'C' : Series ([3 , 6 ], index = ['one' , 'two' ])}
444+ expected = DataFrame (data )
445+ tm .assert_frame_equal (result , expected )
446+
447+ def test_pivot_with_tuple_of_values (self ):
448+ # issue #17160
449+ df = pd .DataFrame ({'foo' : ['one' , 'one' , 'one' , 'two' , 'two' , 'two' ],
450+ 'bar' : ['A' , 'B' , 'C' , 'A' , 'B' , 'C' ],
451+ 'baz' : [1 , 2 , 3 , 4 , 5 , 6 ],
452+ 'zoo' : ['x' , 'y' , 'z' , 'q' , 'w' , 't' ]})
453+ with pytest .raises (KeyError ):
454+ # tuple is seen as a single column name
455+ df .pivot (index = 'zoo' , columns = 'foo' , values = ('bar' , 'baz' ))
456+
374457 def test_margins (self ):
375458 def _check_output (result , values_col , index = ['A' , 'B' ],
376459 columns = ['C' ],
0 commit comments