Skip to content

Commit 2bf7613

Browse files
committed
ENH: respect dtype argument in Panel._init_dict for missing items, GH #411
1 parent 7b93f72 commit 2bf7613

File tree

4 files changed

+37
-17
lines changed

4 files changed

+37
-17
lines changed

pandas/core/frame.py

+1
Original file line numberDiff line numberDiff line change
@@ -2262,6 +2262,7 @@ def _apply_raw(self, func, axis):
22622262

22632263
def _apply_standard(self, func, axis, ignore_failures=False):
22642264
try:
2265+
22652266
assert(not self._is_mixed_type) # maybe a hack for now
22662267
values = self.values
22672268
dummy = Series(np.nan, index=self._get_axis(axis),

pandas/core/panel.py

+15-7
Original file line numberDiff line numberDiff line change
@@ -251,13 +251,21 @@ def _init_dict(self, data, axes, dtype=None):
251251

252252
reshaped_data = data.copy() # shallow
253253
# homogenize
254-
for k, v in data.iteritems():
255-
v = v.reindex(index=major, columns=minor, copy=False)
256-
if dtype is not None:
257-
v = v.astype(dtype)
258-
values = v.values
259-
shape = values.shape
260-
reshaped_data[k] = values.reshape((1,) + shape)
254+
255+
item_shape = (1, len(major), len(minor))
256+
for k in items:
257+
if k not in data:
258+
values = np.empty(item_shape, dtype=dtype)
259+
values.fill(np.nan)
260+
reshaped_data[k] = values
261+
else:
262+
v = data[k]
263+
v = v.reindex(index=major, columns=minor, copy=False)
264+
if dtype is not None:
265+
v = v.astype(dtype)
266+
values = v.values
267+
shape = values.shape
268+
reshaped_data[k] = values.reshape((1,) + shape)
261269

262270
# segregates dtypes and forms blocks matching to columns
263271
blocks = form_blocks(reshaped_data, axes)

pandas/src/reduce.pyx

+15-10
Original file line numberDiff line numberDiff line change
@@ -54,22 +54,15 @@ cdef class Reducer:
5454

5555
arr = self.arr
5656
chunk = self.dummy
57-
it = <flatiter> PyArray_IterNew(result)
5857

5958
dummy_buf = chunk.data
6059
chunk.data = arr.data
6160
try:
62-
for i in range(1, self.nresults):
61+
for i in range(self.nresults):
6362
res = self.f(self.dummy)
6463
if i == 0:
65-
try:
66-
assert(not isinstance(res, np.ndarray))
67-
if hasattr(res, 'dtype'):
68-
result = np.empty(self.nresults, dtype=res.dtype)
69-
else:
70-
result = np.empty(self.nresults, dtype='O')
71-
except Exception:
72-
raise ValueError('function does not reduce')
64+
result = self._get_result_array(res)
65+
it = <flatiter> PyArray_IterNew(result)
7366

7467
PyArray_SETITEM(result, PyArray_ITER_DATA(it), res)
7568
chunk.data = chunk.data + self.increment
@@ -83,6 +76,18 @@ cdef class Reducer:
8376

8477
return result
8578

79+
def _get_result_array(self, object res):
80+
try:
81+
assert(not isinstance(res, np.ndarray))
82+
if hasattr(res, 'dtype'):
83+
result = np.empty(self.nresults, dtype=res.dtype)
84+
else:
85+
result = np.empty(self.nresults, dtype='O')
86+
result[0] = res
87+
except Exception:
88+
raise ValueError('function does not reduce')
89+
return result
90+
8691
def reduce(arr, f, axis=0, dummy=None):
8792
reducer = Reducer(arr, f, axis=axis, dummy=dummy)
8893
return reducer.get_result()

pandas/tests/test_panel.py

+6
Original file line numberDiff line numberDiff line change
@@ -573,6 +573,12 @@ def test_constructor_empty_panel(self):
573573
self.assert_(len(empty.major_axis) == 0)
574574
self.assert_(len(empty.minor_axis) == 0)
575575

576+
def test_constructor_observe_dtype(self):
577+
# GH #411
578+
panel = Panel(items=range(3), major_axis=range(3),
579+
minor_axis=range(3), dtype='O')
580+
self.assert_(panel.values.dtype == np.object_)
581+
576582
def test_consolidate(self):
577583
self.assert_(self.panel._data.is_consolidated())
578584

0 commit comments

Comments
 (0)