Skip to content

Commit 86879ac

Browse files
alexander-ponomaroffjreback
authored andcommitted
Fix concat not respecting order of OrderedDict (pandas-dev#25224)
1 parent 486472a commit 86879ac

File tree

5 files changed

+17
-7
lines changed

5 files changed

+17
-7
lines changed

doc/source/whatsnew/v0.25.0.rst

+1
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ Reshaping
242242
- Bug in :func:`pandas.merge` adds a string of ``None`` if ``None`` is assigned in suffixes instead of remain the column name as-is (:issue:`24782`).
243243
- Bug in :func:`merge` when merging by index name would sometimes result in an incorrectly numbered index (:issue:`24212`)
244244
- :func:`to_records` now accepts dtypes to its `column_dtypes` parameter (:issue:`24895`)
245+
- Bug in :func:`concat` where order of ``OrderedDict`` (and ``dict`` in Python 3.6+) is not respected, when passed in as ``objs`` argument (:issue:`21510`)
245246

246247

247248
Sparse

pandas/core/groupby/generic.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -822,7 +822,7 @@ def _aggregate_multiple_funcs(self, arg, _level):
822822
columns.append(com.get_callable_name(f))
823823
arg = lzip(columns, arg)
824824

825-
results = {}
825+
results = collections.OrderedDict()
826826
for name, func in arg:
827827
obj = self
828828
if name in results:

pandas/core/reshape/concat.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ def __init__(self, objs, axis=0, join='outer', join_axes=None,
253253

254254
if isinstance(objs, dict):
255255
if keys is None:
256-
keys = sorted(objs)
256+
keys = com.dict_keys_to_ordered_list(objs)
257257
objs = [objs[k] for k in keys]
258258
else:
259259
objs = list(objs)

pandas/tests/groupby/test_groupby.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1690,9 +1690,9 @@ def test_groupby_agg_ohlc_non_first():
16901690
[1, 1, 1, 1, 1],
16911691
[1, 1, 1, 1, 1]
16921692
], columns=pd.MultiIndex.from_tuples((
1693-
('foo', 'ohlc', 'open'), ('foo', 'ohlc', 'high'),
1694-
('foo', 'ohlc', 'low'), ('foo', 'ohlc', 'close'),
1695-
('foo', 'sum', 'foo'))), index=pd.date_range(
1693+
('foo', 'sum', 'foo'), ('foo', 'ohlc', 'open'),
1694+
('foo', 'ohlc', 'high'), ('foo', 'ohlc', 'low'),
1695+
('foo', 'ohlc', 'close'))), index=pd.date_range(
16961696
'2018-01-01', periods=2, freq='D'))
16971697

16981698
result = df.groupby(pd.Grouper(freq='D')).agg(['sum', 'ohlc'])

pandas/tests/reshape/test_concat.py

+11-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from collections import deque
1+
from collections import OrderedDict, deque
22
import datetime as dt
33
from datetime import datetime
44
from decimal import Decimal
@@ -18,6 +18,7 @@
1818
from pandas import (
1919
Categorical, DataFrame, DatetimeIndex, Index, MultiIndex, Series,
2020
Timestamp, concat, date_range, isna, read_csv)
21+
import pandas.core.common as com
2122
from pandas.tests.extension.decimal import to_decimal
2223
from pandas.util import testing as tm
2324
from pandas.util.testing import assert_frame_equal, makeCustomDataframe as mkdf
@@ -1162,7 +1163,7 @@ def test_concat_dict(self):
11621163
'baz': DataFrame(np.random.randn(4, 3)),
11631164
'qux': DataFrame(np.random.randn(4, 3))}
11641165

1165-
sorted_keys = sorted(frames)
1166+
sorted_keys = com.dict_keys_to_ordered_list(frames)
11661167

11671168
result = concat(frames)
11681169
expected = concat([frames[k] for k in sorted_keys], keys=sorted_keys)
@@ -2370,6 +2371,14 @@ def test_concat_different_extension_dtypes_upcasts(self):
23702371
], dtype=object)
23712372
tm.assert_series_equal(result, expected)
23722373

2374+
def test_concat_odered_dict(self):
2375+
# GH 21510
2376+
expected = pd.concat([pd.Series(range(3)), pd.Series(range(4))],
2377+
keys=['First', 'Another'])
2378+
result = pd.concat(OrderedDict([('First', pd.Series(range(3))),
2379+
('Another', pd.Series(range(4)))]))
2380+
tm.assert_series_equal(result, expected)
2381+
23732382

23742383
@pytest.mark.parametrize('pdt', [pd.Series, pd.DataFrame])
23752384
@pytest.mark.parametrize('dt', np.sctypes['float'])

0 commit comments

Comments
 (0)