|
3 | 3 | constructors before passing them to a BlockManager.
|
4 | 4 | """
|
5 | 5 | from collections import abc
|
| 6 | +from itertools import groupby |
| 7 | +from operator import itemgetter |
6 | 8 | from typing import (
|
7 | 9 | TYPE_CHECKING,
|
8 | 10 | Any,
|
@@ -240,18 +242,26 @@ def init_ndarray(values, index, columns, dtype: Optional[DtypeObj], copy: bool):
|
240 | 242 | if values.ndim == 2 and values.shape[0] != 1:
|
241 | 243 | # transpose and separate blocks
|
242 | 244 |
|
243 |
| - dvals_list = [maybe_infer_to_datetimelike(row) for row in values] |
244 |
| - for n in range(len(dvals_list)): |
245 |
| - if isinstance(dvals_list[n], np.ndarray): |
246 |
| - dvals_list[n] = dvals_list[n].reshape(1, -1) |
| 245 | + dvals_list = (maybe_infer_to_datetimelike(row) for row in values) |
247 | 246 |
|
248 | 247 | from pandas.core.internals.blocks import make_block
|
249 | 248 |
|
250 |
| - # TODO: What about re-joining object columns? |
251 |
| - block_values = [ |
252 |
| - make_block(dvals_list[n], placement=[n], ndim=2) |
253 |
| - for n in range(len(dvals_list)) |
254 |
| - ] |
| 249 | + i = 0 |
| 250 | + block_values = [] |
| 251 | + for is_object, group in groupby(dvals_list, |
| 252 | + lambda row: is_object_dtype(row.dtype)): |
| 253 | + group = list(group) |
| 254 | + ei = i + len(group) |
| 255 | + if is_object: |
| 256 | + block_values.append(values[i:ei]) |
| 257 | + else: |
| 258 | + block_values.extend( |
| 259 | + make_block(row.reshape(1, -1) if isinstance(row, np.ndarray) |
| 260 | + else row, |
| 261 | + placement=[i + incr], ndim=2) |
| 262 | + for incr, row in enumerate(group) |
| 263 | + ) |
| 264 | + i = ei |
255 | 265 |
|
256 | 266 | else:
|
257 | 267 | datelike_vals = maybe_infer_to_datetimelike(values)
|
|
0 commit comments