|
27 | 27 | is_bool_dtype,
|
28 | 28 | is_object_dtype,
|
29 | 29 | is_datetimelike_v_numeric,
|
| 30 | + is_complex_dtype, |
30 | 31 | is_float_dtype, is_numeric_dtype,
|
31 | 32 | is_numeric_v_string_like, is_extension_type,
|
32 | 33 | is_list_like,
|
@@ -1736,6 +1737,7 @@ class FloatBlock(FloatOrComplexBlock):
|
1736 | 1737 | is_float = True
|
1737 | 1738 | _downcast_dtype = 'int64'
|
1738 | 1739 |
|
| 1740 | + @classmethod |
1739 | 1741 | def _can_hold_element(self, element):
|
1740 | 1742 | if is_list_like(element):
|
1741 | 1743 | element = np.asarray(element)
|
@@ -1786,6 +1788,7 @@ class ComplexBlock(FloatOrComplexBlock):
|
1786 | 1788 | __slots__ = ()
|
1787 | 1789 | is_complex = True
|
1788 | 1790 |
|
| 1791 | + @classmethod |
1789 | 1792 | def _can_hold_element(self, element):
|
1790 | 1793 | if is_list_like(element):
|
1791 | 1794 | element = np.array(element)
|
@@ -1948,6 +1951,7 @@ class BoolBlock(NumericBlock):
|
1948 | 1951 | is_bool = True
|
1949 | 1952 | _can_hold_na = False
|
1950 | 1953 |
|
| 1954 | + @classmethod |
1951 | 1955 | def _can_hold_element(self, element):
|
1952 | 1956 | if is_list_like(element):
|
1953 | 1957 | element = np.asarray(element)
|
@@ -2660,6 +2664,31 @@ def __init__(self, values, placement, ndim=None, fastpath=False, **kwargs):
|
2660 | 2664 | else:
|
2661 | 2665 | self._can_hold_na = False
|
2662 | 2666 |
|
| 2667 | + def _can_hold_element(self, element): |
| 2668 | + """ require the same dtype as ourselves """ |
| 2669 | + dtype = self.values.sp_values.dtype |
| 2670 | + |
| 2671 | + if is_bool_dtype(dtype): |
| 2672 | + return BoolBlock._can_hold_element(element) |
| 2673 | + elif is_integer_dtype(dtype): |
| 2674 | + if is_list_like(element): |
| 2675 | + element = np.array(element) |
| 2676 | + tipo = element.dtype.type |
| 2677 | + return (issubclass(tipo, np.integer) and |
| 2678 | + not issubclass(tipo, |
| 2679 | + (np.datetime64, |
| 2680 | + np.timedelta64)) and |
| 2681 | + dtype.itemsize >= element.dtype.itemsize) |
| 2682 | + return is_integer(element) |
| 2683 | + elif is_float_dtype(dtype): |
| 2684 | + return FloatBlock._can_hold_element(element) |
| 2685 | + elif is_complex_dtype(dtype): |
| 2686 | + return ComplexBlock._can_hold_element(element) |
| 2687 | + elif is_object_dtype(dtype): |
| 2688 | + return True |
| 2689 | + else: |
| 2690 | + return False |
| 2691 | + |
2663 | 2692 | def coerce_to_target_dtype(self, other, copy=True):
|
2664 | 2693 | return super(SparseBlock, self).coerce_to_target_dtype(other, copy)
|
2665 | 2694 |
|
|
0 commit comments