Skip to content

Commit 66f9591

Browse files
BUG: RangeIndex accepting length-1 arrays as argument (#13765)
1 parent 5f49638 commit 66f9591

File tree

4 files changed

+25
-7
lines changed

4 files changed

+25
-7
lines changed

doc/source/whatsnew/v0.19.0.txt

+1
Original file line numberDiff line numberDiff line change
@@ -979,6 +979,7 @@ Bug Fixes
979979
- Bugs in ``Index.difference`` and ``DataFrame.join`` raise in Python3 when using mixed-integer indexes (:issue:`13432`, :issue:`12814`)
980980
- Bug in ``.to_excel()`` when DataFrame contains a MultiIndex which contains a label with a NaN value (:issue:`13511`)
981981
- Bug in invalid frequency offset string like "D1", "-2-3H" may not raise ``ValueError (:issue:`13930`)
982+
- Bug in ``concat`` and ``groupby`` for hierarchical frames with ``RangeIndex`` levels (:issue:`13542`).
982983

983984
- Bug in ``agg()`` function on groupby dataframe changes dtype of ``datetime64[ns]`` column to ``float64`` (:issue:`12821`)
984985

pandas/indexes/range.py

+8-6
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,17 @@ def __new__(cls, start=None, stop=None, step=None, name=None, dtype=None,
5858

5959
# validate the arguments
6060
def _ensure_int(value, field):
61+
msg = ("RangeIndex(...) must be called with integers,"
62+
" {value} was passed for {field}")
63+
if not is_scalar(value):
64+
raise TypeError(msg.format(value=type(value).__name__,
65+
field=field))
6166
try:
6267
new_value = int(value)
6368
assert(new_value == value)
64-
except (ValueError, AssertionError):
65-
raise TypeError("RangeIndex(...) must be called with integers,"
66-
" {value} was passed for {field}".format(
67-
value=type(value).__name__,
68-
field=field)
69-
)
69+
except (TypeError, ValueError, AssertionError):
70+
raise TypeError(msg.format(value=type(value).__name__,
71+
field=field))
7072

7173
return new_value
7274

pandas/tests/indexes/test_range.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@ def test_constructor(self):
102102

103103
# invalid args
104104
for i in [Index(['a', 'b']), Series(['a', 'b']), np.array(['a', 'b']),
105-
[], 'foo', datetime(2000, 1, 1, 0, 0), np.arange(0, 10)]:
105+
[], 'foo', datetime(2000, 1, 1, 0, 0), np.arange(0, 10),
106+
np.array([1]), [1]]:
106107
self.assertRaises(TypeError, lambda: RangeIndex(i))
107108

108109
def test_constructor_same(self):

pandas/tools/tests/test_concat.py

+14
Original file line numberDiff line numberDiff line change
@@ -1444,6 +1444,20 @@ def test_default_index(self):
14441444
tm.assert_frame_equal(res, exp, check_index_type=True,
14451445
check_column_type=True)
14461446

1447+
def test_concat_multiindex_rangeindex(self):
1448+
# GH13542
1449+
# when multi-index levels are RangeIndex objects
1450+
# there is a bug in concat with objects of len 1
1451+
1452+
df = DataFrame(np.random.randn(9, 2))
1453+
df.index = MultiIndex(levels=[pd.RangeIndex(3), pd.RangeIndex(3)],
1454+
labels=[np.repeat(np.arange(3), 3),
1455+
np.tile(np.arange(3), 3)])
1456+
1457+
res = concat([df.iloc[[2, 3, 4], :], df.iloc[[5], :]])
1458+
exp = df.iloc[[2, 3, 4, 5], :]
1459+
tm.assert_frame_equal(res, exp)
1460+
14471461

14481462
if __name__ == '__main__':
14491463
nose.runmodule(argv=[__file__, '-vvs', '-x', '--pdb', '--pdb-failure'],

0 commit comments

Comments
 (0)