From 7df939814d62853651ac10f62eca14ba56028481 Mon Sep 17 00:00:00 2001 From: Robert Meyer Date: Fri, 10 Nov 2017 15:27:21 +0100 Subject: [PATCH 1/4] `_concat_rangeindex_same_dtype` now returns an empty `Int64Index` for empty ranges; Overall the code is more readable by adding the constructors at the beginning and explicitly calling `RangeIndex` constructor. One range index test needed to be changed, because concatenating empty range indexes leads to an empty integer index from now on; --- pandas/core/dtypes/concat.py | 13 ++++--------- pandas/tests/indexes/test_range.py | 5 +++-- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/pandas/core/dtypes/concat.py b/pandas/core/dtypes/concat.py index dc4d819383dfb..b494370f5f348 100644 --- a/pandas/core/dtypes/concat.py +++ b/pandas/core/dtypes/concat.py @@ -571,6 +571,7 @@ def _concat_rangeindex_same_dtype(indexes): indexes = [RangeIndex(3), RangeIndex(3, 6)] -> RangeIndex(6) indexes = [RangeIndex(3), RangeIndex(4, 6)] -> Int64Index([0,1,2,4,5]) """ + from pandas import Int64Index, RangeIndex start = step = next = None @@ -587,14 +588,12 @@ def _concat_rangeindex_same_dtype(indexes): elif step is None: # First non-empty index had only one element if obj._start == start: - from pandas import Int64Index return _concat_index_same_dtype(indexes, klass=Int64Index) step = obj._start - start non_consecutive = ((step != obj._step and len(obj) > 1) or (next is not None and obj._start != next)) if non_consecutive: - from pandas import Int64Index return _concat_index_same_dtype(indexes, klass=Int64Index) if step is not None: @@ -604,12 +603,8 @@ def _concat_rangeindex_same_dtype(indexes): # Get the stop value from "next" or alternatively # from the last non-empty index stop = non_empty_indexes[-1]._stop if next is None else next + return RangeIndex(start, stop, step) else: # Here all "indexes" had 0 length, i.e. were empty. - # Simply take start, stop, and step from the last empty index. - obj = indexes[-1] - start = obj._start - step = obj._step - stop = obj._stop - - return indexes[0].__class__(start, stop, step) + # In this case return an empty integer index. + return Int64Index([]) diff --git a/pandas/tests/indexes/test_range.py b/pandas/tests/indexes/test_range.py index 9fe10885186de..78d7c341f0139 100644 --- a/pandas/tests/indexes/test_range.py +++ b/pandas/tests/indexes/test_range.py @@ -971,8 +971,9 @@ def test_append(self): ([RI(1, 5, 2), RI(5, 6)], RI(1, 6, 2)), ([RI(1, 3, 2), RI(4, 7, 3)], RI(1, 7, 3)), ([RI(-4, 3, 2), RI(4, 7, 2)], RI(-4, 7, 2)), - ([RI(-4, -8), RI(-8, -12)], RI(-8, -12)), - ([RI(-4, -8), RI(3, -4)], RI(3, -8)), + # Concat empty ranges should return empty integer index: + ([RI(-4, -8), RI(-8, -12)], I64([])), + ([RI(-4, -8), RI(3, -4)], I64([])), ([RI(-4, -8), RI(3, 5)], RI(3, 5)), ([RI(-4, -2), RI(3, 5)], I64([-4, -3, 3, 4])), ([RI(-2,), RI(3, 5)], RI(3, 5)), From 7d4c7c7db90ccd677317286a8b3a40a50c722c71 Mon Sep 17 00:00:00 2001 From: Robert Meyer Date: Fri, 10 Nov 2017 18:17:05 +0100 Subject: [PATCH 2/4] Replaced the empty integer index with and empty range index --- pandas/core/dtypes/concat.py | 4 ++-- pandas/tests/indexes/test_range.py | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/pandas/core/dtypes/concat.py b/pandas/core/dtypes/concat.py index b494370f5f348..e05fc0634c30d 100644 --- a/pandas/core/dtypes/concat.py +++ b/pandas/core/dtypes/concat.py @@ -606,5 +606,5 @@ def _concat_rangeindex_same_dtype(indexes): return RangeIndex(start, stop, step) else: # Here all "indexes" had 0 length, i.e. were empty. - # In this case return an empty integer index. - return Int64Index([]) + # In this case return an empty range index. + return RangeIndex(0, 0) diff --git a/pandas/tests/indexes/test_range.py b/pandas/tests/indexes/test_range.py index 78d7c341f0139..7d5e9be690a2d 100644 --- a/pandas/tests/indexes/test_range.py +++ b/pandas/tests/indexes/test_range.py @@ -971,9 +971,8 @@ def test_append(self): ([RI(1, 5, 2), RI(5, 6)], RI(1, 6, 2)), ([RI(1, 3, 2), RI(4, 7, 3)], RI(1, 7, 3)), ([RI(-4, 3, 2), RI(4, 7, 2)], RI(-4, 7, 2)), - # Concat empty ranges should return empty integer index: - ([RI(-4, -8), RI(-8, -12)], I64([])), - ([RI(-4, -8), RI(3, -4)], I64([])), + ([RI(-4, -8), RI(-8, -12)], RI(0,0)), + ([RI(-4, -8), RI(3, -4)], RI(0,0)), ([RI(-4, -8), RI(3, 5)], RI(3, 5)), ([RI(-4, -2), RI(3, 5)], I64([-4, -3, 3, 4])), ([RI(-2,), RI(3, 5)], RI(3, 5)), From 0f5f41ee99ef10c7f14580365568b4839cf72eae Mon Sep 17 00:00:00 2001 From: Robert Meyer Date: Fri, 10 Nov 2017 18:18:21 +0100 Subject: [PATCH 3/4] Fixed pep issues --- pandas/tests/indexes/test_range.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/tests/indexes/test_range.py b/pandas/tests/indexes/test_range.py index 7d5e9be690a2d..7d88b547746f6 100644 --- a/pandas/tests/indexes/test_range.py +++ b/pandas/tests/indexes/test_range.py @@ -971,8 +971,8 @@ def test_append(self): ([RI(1, 5, 2), RI(5, 6)], RI(1, 6, 2)), ([RI(1, 3, 2), RI(4, 7, 3)], RI(1, 7, 3)), ([RI(-4, 3, 2), RI(4, 7, 2)], RI(-4, 7, 2)), - ([RI(-4, -8), RI(-8, -12)], RI(0,0)), - ([RI(-4, -8), RI(3, -4)], RI(0,0)), + ([RI(-4, -8), RI(-8, -12)], RI(0, 0)), + ([RI(-4, -8), RI(3, -4)], RI(0, 0)), ([RI(-4, -8), RI(3, 5)], RI(3, 5)), ([RI(-4, -2), RI(3, 5)], I64([-4, -3, 3, 4])), ([RI(-2,), RI(3, 5)], RI(3, 5)), From 3210504674850dc67ed5f4e6371cda1209212475 Mon Sep 17 00:00:00 2001 From: Robert Meyer Date: Sat, 11 Nov 2017 12:31:33 +0100 Subject: [PATCH 4/4] Removed `else` before the return statement --- pandas/core/dtypes/concat.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pandas/core/dtypes/concat.py b/pandas/core/dtypes/concat.py index e05fc0634c30d..23884869a4d9f 100644 --- a/pandas/core/dtypes/concat.py +++ b/pandas/core/dtypes/concat.py @@ -604,7 +604,7 @@ def _concat_rangeindex_same_dtype(indexes): # from the last non-empty index stop = non_empty_indexes[-1]._stop if next is None else next return RangeIndex(start, stop, step) - else: - # Here all "indexes" had 0 length, i.e. were empty. - # In this case return an empty range index. - return RangeIndex(0, 0) + + # Here all "indexes" had 0 length, i.e. were empty. + # In this case return an empty range index. + return RangeIndex(0, 0)