13
13
from pandas .core .index import (Index , MultiIndex , _ensure_index ,
14
14
_get_combined_index )
15
15
from pandas .core .indexing import _maybe_droplevels , _is_list_like
16
- from pandas .core .internals import (BlockManager ,
16
+ from pandas .core .internals import (BlockManager ,
17
17
create_block_manager_from_arrays ,
18
18
create_block_manager_from_blocks )
19
19
from pandas .core .series import Series
@@ -274,14 +274,18 @@ def _from_axes(cls, data, axes):
274
274
return cls (data , ** d )
275
275
276
276
def _init_dict (self , data , axes , dtype = None ):
277
+ from pandas .util .compat import OrderedDict
277
278
haxis = axes .pop (self ._het_axis )
278
279
279
280
# prefilter if haxis passed
280
281
if haxis is not None :
281
282
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 )
283
284
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 )
285
289
286
290
for k , v in data .iteritems ():
287
291
if isinstance (v , dict ):
@@ -341,11 +345,11 @@ def from_dict(cls, data, intersect=False, orient='items', dtype=None):
341
345
-------
342
346
Panel
343
347
"""
344
- from collections import defaultdict
348
+ from pandas . util . compat import OrderedDict , OrderedDefaultdict
345
349
346
350
orient = orient .lower ()
347
351
if orient == 'minor' :
348
- new_data = defaultdict (dict )
352
+ new_data = OrderedDefaultdict (dict )
349
353
for col , df in data .iteritems ():
350
354
for item , s in df .iteritems ():
351
355
new_data [item ][col ] = s
@@ -354,7 +358,10 @@ def from_dict(cls, data, intersect=False, orient='items', dtype=None):
354
358
raise ValueError ('only recognize items or minor for orientation' )
355
359
356
360
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 )
358
365
return cls (** d )
359
366
360
367
def __getitem__ (self , key ):
@@ -1491,9 +1498,13 @@ def _homogenize_dict(self, frames, intersect=True, dtype=None):
1491
1498
-------
1492
1499
dict of aligned results & indicies
1493
1500
"""
1494
- result = {}
1501
+ from pandas . util . compat import OrderedDict
1495
1502
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 ()
1497
1508
for k , v in frames .iteritems ():
1498
1509
if isinstance (v , dict ):
1499
1510
adj_frames [k ] = self ._constructor_sliced (v )
0 commit comments