Skip to content

Commit 195550c

Browse files
committed
BUG: fix handling of integer level names, caused downstream pivot_table bug #678
1 parent e9cfd35 commit 195550c

File tree

3 files changed

+32
-4
lines changed

3 files changed

+32
-4
lines changed

pandas/core/index.py

+9-4
Original file line numberDiff line numberDiff line change
@@ -1070,15 +1070,20 @@ def dtype(self):
10701070
return np.dtype('O')
10711071

10721072
def _get_level_number(self, level):
1073-
if not isinstance(level, int):
1073+
try:
10741074
count = self.names.count(level)
10751075
if count > 1:
10761076
raise Exception('The name %s occurs multiple times, use a '
10771077
'level number' % level)
1078-
10791078
level = self.names.index(level)
1080-
elif level < 0:
1081-
level += self.nlevels
1079+
except ValueError:
1080+
if not isinstance(level, int):
1081+
raise Exception('Level %s not found' % str(level))
1082+
elif level < 0:
1083+
level += self.nlevels
1084+
elif level >= self.nlevels:
1085+
raise ValueError('Index has only %d levels, not %d'
1086+
% (self.nlevels, level))
10821087
return level
10831088

10841089
@property

pandas/tests/test_index.py

+6
Original file line numberDiff line numberDiff line change
@@ -694,6 +694,12 @@ def test_duplicate_names(self):
694694
self.index.names = ['foo', 'foo']
695695
self.assertRaises(Exception, self.index._get_level_number, 'foo')
696696

697+
def test_get_level_number_integer(self):
698+
self.index.names = [1, 0]
699+
self.assertEqual(self.index._get_level_number(1), 0)
700+
self.assertEqual(self.index._get_level_number(0), 1)
701+
self.assertRaises(Exception, self.index._get_level_number, 2)
702+
697703
def test_from_arrays(self):
698704
arrays = []
699705
for lev, lab in zip(self.index.levels, self.index.labels):

pandas/tools/tests/test_pivot.py

+17
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,23 @@ def _check_output(res, col, rows=['A', 'B'], cols=['C']):
128128
gmarg = table[item]['All', '']
129129
self.assertEqual(gmarg, self.data[item].mean())
130130

131+
def test_pivot_integer_columns(self):
132+
# caused by upstream bug in unstack
133+
import itertools
134+
import datetime
135+
import pandas
136+
137+
d = datetime.date.min
138+
data = list(itertools.product(
139+
['foo', 'bar'], ['A', 'B', 'C'], ['x1', 'x2'],
140+
[d + datetime.timedelta(i) for i in xrange(20)], [1.0]))
141+
df = pandas.DataFrame(data)
142+
table = df.pivot_table(values=4, rows=[0,1,3],cols=[2])
143+
144+
df2 = df.rename(columns=str)
145+
table2 = df2.pivot_table(values='4', rows=['0','1','3'], cols=['2'])
146+
147+
tm.assert_frame_equal(table, table2)
131148

132149
class TestCrosstab(unittest.TestCase):
133150

0 commit comments

Comments
 (0)