@@ -371,6 +371,89 @@ def test_pivot_periods(self):
371
371
pv = df .pivot (index = 'p1' , columns = 'p2' , values = 'data1' )
372
372
tm .assert_frame_equal (pv , expected )
373
373
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
+
374
457
def test_margins (self ):
375
458
def _check_output (result , values_col , index = ['A' , 'B' ],
376
459
columns = ['C' ],
0 commit comments