@@ -119,9 +119,14 @@ def cut(x, bins, right=True, labels=None, retbins=False, precision=3,
119
119
if (np .diff (bins ) < 0 ).any ():
120
120
raise ValueError ('bins must increase monotonically.' )
121
121
122
- return _bins_to_cuts (x , bins , right = right , labels = labels ,
123
- retbins = retbins , precision = precision ,
124
- include_lowest = include_lowest , dtype = dtype )
122
+ x_is_series , series_index , name , x = _preprocess_for_cut (x )
123
+
124
+ fac , bins = _bins_to_cuts (x , bins , right = right , labels = labels ,
125
+ retbins = retbins , precision = precision ,
126
+ include_lowest = include_lowest , dtype = dtype )
127
+
128
+ return _postprocess_for_cut (fac , bins , retbins , x_is_series ,
129
+ series_index , name )
125
130
126
131
127
132
def qcut (x , q , labels = None , retbins = False , precision = 3 ):
@@ -173,28 +178,24 @@ def qcut(x, q, labels=None, retbins=False, precision=3):
173
178
"""
174
179
original , x , dtype = _coerce_to_type (x )
175
180
181
+ x_is_series , series_index , name , x = _preprocess_for_cut (x )
182
+
176
183
if is_integer (q ):
177
184
quantiles = np .linspace (0 , 1 , q + 1 )
178
185
else :
179
186
quantiles = q
180
187
bins = algos .quantile (x , quantiles )
181
- return _bins_to_cuts (x , bins , labels = labels , retbins = retbins ,
182
- precision = precision , include_lowest = True ,
183
- dtype = dtype )
188
+ fac , bins = _bins_to_cuts (x , bins , labels = labels , retbins = retbins ,
189
+ precision = precision , include_lowest = True ,
190
+ dtype = dtype )
191
+
192
+ return _postprocess_for_cut (fac , bins , retbins , x_is_series ,
193
+ series_index , name )
184
194
185
195
186
196
def _bins_to_cuts (x , bins , right = True , labels = None , retbins = False ,
187
197
precision = 3 , name = None , include_lowest = False ,
188
198
dtype = None ):
189
- x_is_series = isinstance (x , Series )
190
- series_index = None
191
-
192
- if x_is_series :
193
- series_index = x .index
194
- if name is None :
195
- name = x .name
196
-
197
- x = np .asarray (x )
198
199
199
200
side = 'left' if right else 'right'
200
201
ids = bins .searchsorted (x , side = side )
@@ -239,12 +240,6 @@ def _bins_to_cuts(x, bins, right=True, labels=None, retbins=False,
239
240
fac = fac .astype (np .float64 )
240
241
np .putmask (fac , na_mask , np .nan )
241
242
242
- if x_is_series :
243
- fac = Series (fac , index = series_index , name = name )
244
-
245
- if not retbins :
246
- return fac
247
-
248
243
return fac , bins
249
244
250
245
@@ -327,3 +322,25 @@ def _coerce_to_type(x):
327
322
x = x .view (np .int64 )
328
323
dtype = np .datetime64
329
324
return original , x , dtype
325
+
326
+
327
+ def _preprocess_for_cut (x ):
328
+ x_is_series = isinstance (x , Series )
329
+ series_index = None
330
+
331
+ name = None
332
+ if x_is_series :
333
+ series_index = x .index
334
+ if name is None :
335
+ name = x .name
336
+ return x_is_series , series_index , name , x
337
+
338
+
339
+ def _postprocess_for_cut (fac , bins , retbins , x_is_series , series_index , name ):
340
+ if x_is_series :
341
+ fac = Series (fac , index = series_index , name = name )
342
+
343
+ if not retbins :
344
+ return fac
345
+
346
+ return fac , bins
0 commit comments