@@ -351,6 +351,48 @@ def test_astype_bytes(self):
351
351
352
352
353
353
class 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
+
354
396
def test_astype_categorical_invalid_conversions (self ):
355
397
# invalid conversion (these are NOT a dtype)
356
398
cat = Categorical ([f"{ i } - { i + 499 } " for i in range (0 , 10000 , 500 )])
@@ -427,3 +469,22 @@ def test_astype_categories_raises(self):
427
469
s = Series (["a" , "b" , "a" ])
428
470
with pytest .raises (TypeError , match = "got an unexpected" ):
429
471
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