@@ -664,6 +664,8 @@ def test_empty_str_methods(self):
664664 tm .assert_series_equal (empty_str , empty .str .pad (42 ))
665665 tm .assert_series_equal (empty_str , empty .str .center (42 ))
666666 tm .assert_series_equal (empty_list , empty .str .split ('a' ))
667+ tm .assert_series_equal (empty_list , empty .str .partition ('a' , expand = False ))
668+ tm .assert_series_equal (empty_list , empty .str .rpartition ('a' , expand = False ))
667669 tm .assert_series_equal (empty_str , empty .str .slice (stop = 1 ))
668670 tm .assert_series_equal (empty_str , empty .str .slice (step = 1 ))
669671 tm .assert_series_equal (empty_str , empty .str .strip ())
@@ -687,6 +689,12 @@ def test_empty_str_methods(self):
687689 tm .assert_series_equal (empty_str , empty .str .swapcase ())
688690 tm .assert_series_equal (empty_str , empty .str .normalize ('NFC' ))
689691
692+ def test_empty_str_methods_to_frame (self ):
693+ empty_str = empty = Series (dtype = str )
694+ empty_df = DataFrame ([])
695+ tm .assert_frame_equal (empty_df , empty .str .partition ('a' ))
696+ tm .assert_frame_equal (empty_df , empty .str .rpartition ('a' ))
697+
690698 def test_ismethods (self ):
691699 values = ['A' , 'b' , 'Xy' , '4' , '3A' , '' , 'TT' , '55' , '-' , ' ' ]
692700 str_s = Series (values )
@@ -1175,6 +1183,119 @@ def test_split_to_dataframe(self):
11751183 with tm .assertRaisesRegexp (ValueError , "return_type must be" ):
11761184 s .str .split ('_' , return_type = "some_invalid_type" )
11771185
1186+ def test_partition_series (self ):
1187+ values = Series (['a_b_c' , 'c_d_e' , NA , 'f_g_h' ])
1188+
1189+ result = values .str .partition ('_' , expand = False )
1190+ exp = Series ([['a' , '_' , 'b_c' ], ['c' , '_' , 'd_e' ], NA , ['f' , '_' , 'g_h' ]])
1191+ tm .assert_series_equal (result , exp )
1192+
1193+ result = values .str .rpartition ('_' , expand = False )
1194+ exp = Series ([['a_b' , '_' , 'c' ], ['c_d' , '_' , 'e' ], NA , ['f_g' , '_' , 'h' ]])
1195+ tm .assert_series_equal (result , exp )
1196+
1197+ # more than one char
1198+ values = Series (['a__b__c' , 'c__d__e' , NA , 'f__g__h' ])
1199+ result = values .str .partition ('__' , expand = False )
1200+ exp = Series ([['a' , '__' , 'b__c' ], ['c' , '__' , 'd__e' ], NA , ['f' , '__' , 'g__h' ]])
1201+ tm .assert_series_equal (result , exp )
1202+
1203+ result = values .str .rpartition ('__' , expand = False )
1204+ exp = Series ([['a__b' , '__' , 'c' ], ['c__d' , '__' , 'e' ], NA , ['f__g' , '__' , 'h' ]])
1205+ tm .assert_series_equal (result , exp )
1206+
1207+ # None
1208+ values = Series (['a b c' , 'c d e' , NA , 'f g h' ])
1209+ result = values .str .partition (expand = False )
1210+ exp = Series ([['a' , ' ' , 'b c' ], ['c' , ' ' , 'd e' ], NA , ['f' , ' ' , 'g h' ]])
1211+ tm .assert_series_equal (result , exp )
1212+
1213+ result = values .str .rpartition (expand = False )
1214+ exp = Series ([['a b' , ' ' , 'c' ], ['c d' , ' ' , 'e' ], NA , ['f g' , ' ' , 'h' ]])
1215+ tm .assert_series_equal (result , exp )
1216+
1217+ # Not splited
1218+ values = Series (['abc' , 'cde' , NA , 'fgh' ])
1219+ result = values .str .partition ('_' , expand = False )
1220+ exp = Series ([['abc' , '' , '' ], ['cde' , '' , '' ], NA , ['fgh' , '' , '' ]])
1221+ tm .assert_series_equal (result , exp )
1222+
1223+ result = values .str .rpartition ('_' , expand = False )
1224+ exp = Series ([['' , '' , 'abc' ], ['' , '' , 'cde' ], NA , ['' , '' , 'fgh' ]])
1225+ tm .assert_series_equal (result , exp )
1226+
1227+ # unicode
1228+ values = Series ([u ('a_b_c' ), u ('c_d_e' ), NA , u ('f_g_h' )])
1229+
1230+ result = values .str .partition ('_' , expand = False )
1231+ exp = Series ([[u ('a' ), u ('_' ), u ('b_c' )], [u ('c' ), u ('_' ), u ('d_e' )],
1232+ NA , [u ('f' ), u ('_' ), u ('g_h' )]])
1233+ tm .assert_series_equal (result , exp )
1234+
1235+ result = values .str .rpartition ('_' , expand = False )
1236+ exp = Series ([[u ('a_b' ), u ('_' ), u ('c' )], [u ('c_d' ), u ('_' ), u ('e' )],
1237+ NA , [u ('f_g' ), u ('_' ), u ('h' )]])
1238+ tm .assert_series_equal (result , exp )
1239+
1240+ # compare to standard lib
1241+ values = Series (['A_B_C' , 'B_C_D' , 'E_F_G' , 'EFGHEF' ])
1242+ result = values .str .partition ('_' , expand = False ).tolist ()
1243+ self .assertEqual (result , [v .partition ('_' ) for v in values ])
1244+ result = values .str .rpartition ('_' , expand = False ).tolist ()
1245+ self .assertEqual (result , [v .rpartition ('_' ) for v in values ])
1246+
1247+ def test_partition_index (self ):
1248+ values = Index (['a_b_c' , 'c_d_e' , 'f_g_h' ])
1249+
1250+ result = values .str .partition ('_' , expand = False )
1251+ exp = Index (np .array ([('a' , '_' , 'b_c' ), ('c' , '_' , 'd_e' ), ('f' , '_' , 'g_h' )]))
1252+ tm .assert_index_equal (result , exp )
1253+ self .assertEqual (result .nlevels , 1 )
1254+
1255+ result = values .str .rpartition ('_' , expand = False )
1256+ exp = Index (np .array ([('a_b' , '_' , 'c' ), ('c_d' , '_' , 'e' ), ('f_g' , '_' , 'h' )]))
1257+ tm .assert_index_equal (result , exp )
1258+ self .assertEqual (result .nlevels , 1 )
1259+
1260+ result = values .str .partition ('_' )
1261+ exp = Index ([('a' , '_' , 'b_c' ), ('c' , '_' , 'd_e' ), ('f' , '_' , 'g_h' )])
1262+ tm .assert_index_equal (result , exp )
1263+ self .assertTrue (isinstance (result , MultiIndex ))
1264+ self .assertEqual (result .nlevels , 3 )
1265+
1266+ result = values .str .rpartition ('_' )
1267+ exp = Index ([('a_b' , '_' , 'c' ), ('c_d' , '_' , 'e' ), ('f_g' , '_' , 'h' )])
1268+ tm .assert_index_equal (result , exp )
1269+ self .assertTrue (isinstance (result , MultiIndex ))
1270+ self .assertEqual (result .nlevels , 3 )
1271+
1272+ def test_partition_to_dataframe (self ):
1273+ values = Series (['a_b_c' , 'c_d_e' , NA , 'f_g_h' ])
1274+ result = values .str .partition ('_' )
1275+ exp = DataFrame ({0 : ['a' , 'c' , np .nan , 'f' ],
1276+ 1 : ['_' , '_' , np .nan , '_' ],
1277+ 2 : ['b_c' , 'd_e' , np .nan , 'g_h' ]})
1278+ tm .assert_frame_equal (result , exp )
1279+
1280+ result = values .str .rpartition ('_' )
1281+ exp = DataFrame ({0 : ['a_b' , 'c_d' , np .nan , 'f_g' ],
1282+ 1 : ['_' , '_' , np .nan , '_' ],
1283+ 2 : ['c' , 'e' , np .nan , 'h' ]})
1284+ tm .assert_frame_equal (result , exp )
1285+
1286+ values = Series (['a_b_c' , 'c_d_e' , NA , 'f_g_h' ])
1287+ result = values .str .partition ('_' , expand = True )
1288+ exp = DataFrame ({0 : ['a' , 'c' , np .nan , 'f' ],
1289+ 1 : ['_' , '_' , np .nan , '_' ],
1290+ 2 : ['b_c' , 'd_e' , np .nan , 'g_h' ]})
1291+ tm .assert_frame_equal (result , exp )
1292+
1293+ result = values .str .rpartition ('_' , expand = True )
1294+ exp = DataFrame ({0 : ['a_b' , 'c_d' , np .nan , 'f_g' ],
1295+ 1 : ['_' , '_' , np .nan , '_' ],
1296+ 2 : ['c' , 'e' , np .nan , 'h' ]})
1297+ tm .assert_frame_equal (result , exp )
1298+
11781299 def test_pipe_failures (self ):
11791300 # #2119
11801301 s = Series (['A|B|C' ])
0 commit comments