Skip to content

Commit c7e8ea4

Browse files
author
y-p
committed
BUG: Panel ctor and from_dict should respect ordering when given OrderedDict GH3303
1 parent ea513d5 commit c7e8ea4

File tree

1 file changed

+18
-7
lines changed

1 file changed

+18
-7
lines changed

pandas/core/panel.py

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -274,14 +274,18 @@ def _from_axes(cls, data, axes):
274274
return cls(data, **d)
275275

276276
def _init_dict(self, data, axes, dtype=None):
277+
from pandas.util.compat import OrderedDict
277278
haxis = axes.pop(self._het_axis)
278279

279280
# prefilter if haxis passed
280281
if haxis is not None:
281282
haxis = _ensure_index(haxis)
282-
data = dict((k, v) for k, v in data.iteritems() if k in haxis)
283+
data = OrderedDict((k, v) for k, v in data.iteritems() if k in haxis)
283284
else:
284-
haxis = Index(_try_sort(data.keys()))
285+
ks = data.keys()
286+
if not isinstance(data,OrderedDict):
287+
ks = _try_sort(ks)
288+
haxis = Index(ks)
285289

286290
for k, v in data.iteritems():
287291
if isinstance(v, dict):
@@ -341,11 +345,11 @@ def from_dict(cls, data, intersect=False, orient='items', dtype=None):
341345
-------
342346
Panel
343347
"""
344-
from collections import defaultdict
348+
from pandas.util.compat import OrderedDict,OrderedDefaultdict
345349

346350
orient = orient.lower()
347351
if orient == 'minor':
348-
new_data = defaultdict(dict)
352+
new_data = OrderedDefaultdict(dict)
349353
for col, df in data.iteritems():
350354
for item, s in df.iteritems():
351355
new_data[item][col] = s
@@ -354,7 +358,10 @@ def from_dict(cls, data, intersect=False, orient='items', dtype=None):
354358
raise ValueError('only recognize items or minor for orientation')
355359

356360
d = cls._homogenize_dict(cls, data, intersect=intersect, dtype=dtype)
357-
d[cls._info_axis] = Index(sorted(d['data'].keys()))
361+
ks = d['data'].keys()
362+
if not isinstance(d['data'],OrderedDict):
363+
ks = list(sorted(ks))
364+
d[cls._info_axis] = Index(ks)
358365
return cls(**d)
359366

360367
def __getitem__(self, key):
@@ -1491,9 +1498,13 @@ def _homogenize_dict(self, frames, intersect=True, dtype=None):
14911498
-------
14921499
dict of aligned results & indicies
14931500
"""
1494-
result = {}
1501+
from pandas.util.compat import OrderedDict
14951502

1496-
adj_frames = {}
1503+
result = dict()
1504+
if isinstance(frames,OrderedDict): # caller differs dict/ODict, presered type
1505+
result = OrderedDict()
1506+
1507+
adj_frames = OrderedDict()
14971508
for k, v in frames.iteritems():
14981509
if isinstance(v, dict):
14991510
adj_frames[k] = self._constructor_sliced(v)

0 commit comments

Comments
 (0)