@@ -1656,6 +1656,51 @@ def test_categorical_margins_category(self, observed):
1656
1656
table = df .pivot_table ("x" , "y" , "z" , dropna = observed , margins = True )
1657
1657
tm .assert_frame_equal (table , expected )
1658
1658
1659
+ def test_pivot_with_categorical (self , observed , ordered_fixture ):
1660
+ # gh-21370
1661
+ idx = [np .nan , "low" , "high" , "low" , np .nan ]
1662
+ col = [np .nan , "A" , "B" , np .nan , "A" ]
1663
+ df = pd .DataFrame (
1664
+ {
1665
+ "In" : pd .Categorical (
1666
+ idx , categories = ["low" , "high" ], ordered = ordered_fixture
1667
+ ),
1668
+ "Col" : pd .Categorical (
1669
+ col , categories = ["A" , "B" ], ordered = ordered_fixture
1670
+ ),
1671
+ "Val" : range (1 , 6 ),
1672
+ }
1673
+ )
1674
+ # case with index/columns/value
1675
+ result = df .pivot_table (
1676
+ index = "In" , columns = "Col" , values = "Val" , observed = observed
1677
+ )
1678
+
1679
+ expected_cols = pd .CategoricalIndex (
1680
+ ["A" , "B" ], ordered = ordered_fixture , name = "Col"
1681
+ )
1682
+
1683
+ expected = pd .DataFrame (
1684
+ data = [[2.0 , np .nan ], [np .nan , 3.0 ]], columns = expected_cols
1685
+ )
1686
+ expected .index = Index (
1687
+ pd .Categorical (
1688
+ ["low" , "high" ], categories = ["low" , "high" ], ordered = ordered_fixture
1689
+ ),
1690
+ name = "In" ,
1691
+ )
1692
+
1693
+ tm .assert_frame_equal (result , expected )
1694
+
1695
+ # case with columns/value
1696
+ result = df .pivot_table (columns = "Col" , values = "Val" , observed = observed )
1697
+
1698
+ expected = pd .DataFrame (
1699
+ data = [[3.5 , 3.0 ]], columns = expected_cols , index = Index (["Val" ])
1700
+ )
1701
+
1702
+ tm .assert_frame_equal (result , expected )
1703
+
1659
1704
def test_categorical_aggfunc (self , observed ):
1660
1705
# GH 9534
1661
1706
df = pd .DataFrame (
0 commit comments