Skip to content

Commit 0491971

Browse files
committed
BUG: Various issues with maybe_convert_objects (GH #2845)
1 parent 992a530 commit 0491971

File tree

1 file changed

+49
-51
lines changed

1 file changed

+49
-51
lines changed

pandas/src/inference.pyx

Lines changed: 49 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,7 @@ def maybe_convert_objects(ndarray[object] objects, bint try_float=0,
403403
bint seen_bool = 0
404404
bint seen_object = 0
405405
bint seen_null = 0
406+
bint seen_numeric = 0
406407
object val, onan
407408
float64_t fval, fnan
408409

@@ -437,12 +438,17 @@ def maybe_convert_objects(ndarray[object] objects, bint try_float=0,
437438
else:
438439
seen_object = 1
439440
# objects[i] = val.astype('O')
441+
break
440442
elif util.is_integer_object(val):
441443
seen_int = 1
442444
floats[i] = <float64_t> val
443445
complexes[i] = <double complex> val
444446
if not seen_null:
445-
ints[i] = val
447+
try:
448+
ints[i] = val
449+
except OverflowError:
450+
seen_object = 1
451+
break
446452
elif util.is_complex_object(val):
447453
complexes[i] = val
448454
seen_complex = 1
@@ -452,6 +458,7 @@ def maybe_convert_objects(ndarray[object] objects, bint try_float=0,
452458
idatetimes[i] = convert_to_tsobject(val, None).value
453459
else:
454460
seen_object = 1
461+
break
455462
elif try_float and not util.is_string_object(val):
456463
# this will convert Decimal objects
457464
try:
@@ -460,72 +467,63 @@ def maybe_convert_objects(ndarray[object] objects, bint try_float=0,
460467
seen_float = 1
461468
except Exception:
462469
seen_object = 1
470+
break
463471
else:
464472
seen_object = 1
473+
break
474+
475+
seen_numeric = seen_complex or seen_float or seen_int
476+
477+
if not seen_object:
465478

466-
if not safe:
467-
if seen_null:
468-
if (seen_float or seen_int) and not seen_object:
479+
if not safe:
480+
if seen_null:
469481
if seen_complex:
470482
return complexes
471-
else:
483+
elif seen_float or seen_int:
472484
return floats
473485
else:
474-
return objects
475-
else:
476-
if seen_object:
477-
return objects
478-
elif not seen_bool:
479-
if seen_datetime:
480-
if seen_complex or seen_float or seen_int:
481-
return objects
486+
if not seen_bool:
487+
if seen_datetime:
488+
if not seen_numeric:
489+
return datetimes
482490
else:
483-
return datetimes
484-
else:
485-
if seen_complex:
486-
return complexes
487-
elif seen_float:
488-
return floats
489-
elif seen_int:
490-
return ints
491-
else:
492-
if not seen_float and not seen_int:
491+
if seen_complex:
492+
return complexes
493+
elif seen_float:
494+
return floats
495+
elif seen_int:
496+
return ints
497+
elif not seen_datetime and not seen_numeric:
493498
return bools.view(np.bool_)
494499

495-
return objects
496-
else:
497-
# don't cast int to float, etc.
498-
if seen_null:
499-
if (seen_float or seen_int) and not seen_object:
500-
if seen_complex:
501-
return complexes
502-
else:
503-
return floats
504-
else:
505-
return objects
506500
else:
507-
if seen_object:
508-
return objects
509-
elif not seen_bool:
510-
if seen_datetime:
511-
if seen_complex or seen_float or seen_int:
512-
return objects
513-
else:
514-
return datetimes
515-
else:
516-
if seen_int and seen_float:
517-
return objects
518-
elif seen_complex:
501+
# don't cast int to float, etc.
502+
if seen_null:
503+
if seen_complex:
504+
if not seen_int:
519505
return complexes
520-
elif seen_float:
506+
elif seen_float:
507+
if not seen_int:
521508
return floats
522-
elif seen_int:
523-
return ints
524509
else:
525-
if not seen_float and not seen_int:
510+
if not seen_bool:
511+
if seen_datetime:
512+
if not seen_numeric:
513+
return datetimes
514+
else:
515+
if seen_complex:
516+
if not seen_int:
517+
return complexes
518+
elif seen_float:
519+
if not seen_int:
520+
return floats
521+
elif seen_int:
522+
return ints
523+
elif not seen_datetime and not seen_numeric:
526524
return bools.view(np.bool_)
527525

528-
return objects
526+
return objects
529527

530528

531529
def convert_sql_column(x):

0 commit comments

Comments
 (0)