Validate that value and indexer are the same length. A special-case is allowed for when the indexer is a boolean array and the number of true values equals the length of ``value``. In this case, no exception is raised. Parameters ---------- indexer : sequence K
(indexer, value, values)
| 123 | |
| 124 | |
| 125 | def check_setitem_lengths(indexer, value, values) -> bool: |
| 126 | """ |
| 127 | Validate that value and indexer are the same length. |
| 128 | |
| 129 | A special-case is allowed for when the indexer is a boolean array |
| 130 | and the number of true values equals the length of ``value``. In |
| 131 | this case, no exception is raised. |
| 132 | |
| 133 | Parameters |
| 134 | ---------- |
| 135 | indexer : sequence |
| 136 | Key for the setitem. |
| 137 | value : array-like |
| 138 | Value for the setitem. |
| 139 | values : array-like |
| 140 | Values being set into. |
| 141 | |
| 142 | Returns |
| 143 | ------- |
| 144 | bool |
| 145 | Whether this is an empty listlike setting which is a no-op. |
| 146 | |
| 147 | Raises |
| 148 | ------ |
| 149 | ValueError |
| 150 | When the indexer is an ndarray or list and the lengths don't match. |
| 151 | """ |
| 152 | no_op = False |
| 153 | |
| 154 | if isinstance(indexer, (np.ndarray, list)): |
| 155 | # We can ignore other listlikes because they are either |
| 156 | # a) not necessarily 1-D indexers, e.g. tuple |
| 157 | # b) boolean indexers e.g. BoolArray |
| 158 | if is_list_like(value): |
| 159 | if len(indexer) != len(value) and values.ndim == 1: |
| 160 | # boolean with truth values == len of the value is ok too |
| 161 | if isinstance(indexer, list): |
| 162 | indexer = np.array(indexer) |
| 163 | if not ( |
| 164 | isinstance(indexer, np.ndarray) |
| 165 | and indexer.dtype == np.bool_ |
| 166 | and indexer.sum() == len(value) |
| 167 | ): |
| 168 | raise ValueError( |
| 169 | "cannot set using a list-like indexer " |
| 170 | "with a different length than the value" |
| 171 | ) |
| 172 | if not len(indexer): |
| 173 | no_op = True |
| 174 | |
| 175 | elif isinstance(indexer, slice): |
| 176 | if is_list_like(value): |
| 177 | if len(value) != length_of_indexer(indexer, values) and values.ndim == 1: |
| 178 | # In case of two dimensional value is used row-wise and broadcasted |
| 179 | raise ValueError( |
| 180 | "cannot set using a slice indexer with a " |
| 181 | "different length than the value" |
| 182 | ) |
no test coverage detected