@@ -351,6 +351,48 @@ def test_astype_bytes(self):
351351
352352
353353class TestAstypeCategorical :
354+ def test_astype_categorical_to_other (self ):
355+ cat = Categorical ([f"{ i } - { i + 499 } " for i in range (0 , 10000 , 500 )])
356+ ser = Series (np .random .RandomState (0 ).randint (0 , 10000 , 100 )).sort_values ()
357+ ser = cut (ser , range (0 , 10500 , 500 ), right = False , labels = cat )
358+
359+ expected = ser
360+ tm .assert_series_equal (ser .astype ("category" ), expected )
361+ tm .assert_series_equal (ser .astype (CategoricalDtype ()), expected )
362+ msg = r"Cannot cast object dtype to float64"
363+ with pytest .raises (ValueError , match = msg ):
364+ ser .astype ("float64" )
365+
366+ cat = Series (Categorical (["a" , "b" , "b" , "a" , "a" , "c" , "c" , "c" ]))
367+ exp = Series (["a" , "b" , "b" , "a" , "a" , "c" , "c" , "c" ])
368+ tm .assert_series_equal (cat .astype ("str" ), exp )
369+ s2 = Series (Categorical (["1" , "2" , "3" , "4" ]))
370+ exp2 = Series ([1 , 2 , 3 , 4 ]).astype ("int" )
371+ tm .assert_series_equal (s2 .astype ("int" ), exp2 )
372+
373+ # object don't sort correctly, so just compare that we have the same
374+ # values
375+ def cmp (a , b ):
376+ tm .assert_almost_equal (np .sort (np .unique (a )), np .sort (np .unique (b )))
377+
378+ expected = Series (np .array (ser .values ), name = "value_group" )
379+ cmp (ser .astype ("object" ), expected )
380+ cmp (ser .astype (np .object_ ), expected )
381+
382+ # array conversion
383+ tm .assert_almost_equal (np .array (ser ), np .array (ser .values ))
384+
385+ tm .assert_series_equal (ser .astype ("category" ), ser )
386+ tm .assert_series_equal (ser .astype (CategoricalDtype ()), ser )
387+
388+ roundtrip_expected = ser .cat .set_categories (
389+ ser .cat .categories .sort_values ()
390+ ).cat .remove_unused_categories ()
391+ result = ser .astype ("object" ).astype ("category" )
392+ tm .assert_series_equal (result , roundtrip_expected )
393+ result = ser .astype ("object" ).astype (CategoricalDtype ())
394+ tm .assert_series_equal (result , roundtrip_expected )
395+
354396 def test_astype_categorical_invalid_conversions (self ):
355397 # invalid conversion (these are NOT a dtype)
356398 cat = Categorical ([f"{ i } - { i + 499 } " for i in range (0 , 10000 , 500 )])
@@ -427,3 +469,22 @@ def test_astype_categories_raises(self):
427469 s = Series (["a" , "b" , "a" ])
428470 with pytest .raises (TypeError , match = "got an unexpected" ):
429471 s .astype ("category" , categories = ["a" , "b" ], ordered = True )
472+
473+ @pytest .mark .parametrize ("items" , [["a" , "b" , "c" , "a" ], [1 , 2 , 3 , 1 ]])
474+ def test_astype_from_categorical (self , items ):
475+ ser = Series (items )
476+ exp = Series (Categorical (items ))
477+ res = ser .astype ("category" )
478+ tm .assert_series_equal (res , exp )
479+
480+ def test_astype_from_categorical_with_keywords (self ):
481+ # with keywords
482+ lst = ["a" , "b" , "c" , "a" ]
483+ ser = Series (lst )
484+ exp = Series (Categorical (lst , ordered = True ))
485+ res = ser .astype (CategoricalDtype (None , ordered = True ))
486+ tm .assert_series_equal (res , exp )
487+
488+ exp = Series (Categorical (lst , categories = list ("abcdef" ), ordered = True ))
489+ res = ser .astype (CategoricalDtype (list ("abcdef" ), ordered = True ))
490+ tm .assert_series_equal (res , exp )
0 commit comments