@@ -1072,28 +1072,50 @@ def test_extractall_single_group_with_quantifier(self):
1072
1072
e = DataFrame (['ab' , 'abc' , 'd' , 'cd' ], i )
1073
1073
tm .assert_frame_equal (r , e )
1074
1074
1075
- def test_extractall_no_matches (self ):
1076
- s = Series (['a3' , 'b3' , 'd4c2' ], name = 'series_name' )
1075
+ @pytest .mark .parametrize ('data, names' , [
1076
+ ([], (None , )),
1077
+ ([], ('i1' , )),
1078
+ ([], (None , 'i2' )),
1079
+ ([], ('i1' , 'i2' )),
1080
+ (['a3' , 'b3' , 'd4c2' ], (None , )),
1081
+ (['a3' , 'b3' , 'd4c2' ], ('i1' , 'i2' )),
1082
+ (['a3' , 'b3' , 'd4c2' ], (None , 'i2' )),
1083
+ (['a3' , 'b3' , 'd4c2' ], ('i1' , 'i2' )),
1084
+ ])
1085
+ def test_extractall_no_matches (self , data , names ):
1086
+ # GH19075 extractall with no matches should return a valid MultiIndex
1087
+ n = len (data )
1088
+ if len (names ) == 1 :
1089
+ i = Index (range (n ), name = names [0 ])
1090
+ else :
1091
+ a = (tuple ([i ] * (n - 1 )) for i in range (n ))
1092
+ i = MultiIndex .from_tuples (a , names = names )
1093
+ s = Series (data , name = 'series_name' , index = i , dtype = 'object' )
1094
+ ei = MultiIndex .from_tuples ([], names = (names + ('match' ,)))
1095
+
1077
1096
# one un-named group.
1078
1097
r = s .str .extractall ('(z)' )
1079
- e = DataFrame (columns = [0 ])
1098
+ e = DataFrame (columns = [0 ], index = ei )
1080
1099
tm .assert_frame_equal (r , e )
1100
+
1081
1101
# two un-named groups.
1082
1102
r = s .str .extractall ('(z)(z)' )
1083
- e = DataFrame (columns = [0 , 1 ])
1103
+ e = DataFrame (columns = [0 , 1 ], index = ei )
1084
1104
tm .assert_frame_equal (r , e )
1105
+
1085
1106
# one named group.
1086
1107
r = s .str .extractall ('(?P<first>z)' )
1087
- e = DataFrame (columns = ["first" ])
1108
+ e = DataFrame (columns = ["first" ], index = ei )
1088
1109
tm .assert_frame_equal (r , e )
1110
+
1089
1111
# two named groups.
1090
1112
r = s .str .extractall ('(?P<first>z)(?P<second>z)' )
1091
- e = DataFrame (columns = ["first" , "second" ])
1113
+ e = DataFrame (columns = ["first" , "second" ], index = ei )
1092
1114
tm .assert_frame_equal (r , e )
1115
+
1093
1116
# one named, one un-named.
1094
1117
r = s .str .extractall ('(z)(?P<second>z)' )
1095
- e = DataFrame (columns = [0 ,
1096
- "second" ])
1118
+ e = DataFrame (columns = [0 , "second" ], index = ei )
1097
1119
tm .assert_frame_equal (r , e )
1098
1120
1099
1121
def test_extractall_stringindex (self ):
0 commit comments