Skip to content

Commit 3fc528c

Browse files
committed
BUG: group_index being computed incorrectly in unstacker, only presents itself if nlevels > 3
1 parent 527f64a commit 3fc528c

File tree

2 files changed

+19
-6
lines changed

2 files changed

+19
-6
lines changed

pandas/core/reshape.py

+5-6
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,12 @@ def _make_selectors(self):
8282
new_levels = self.new_index_levels
8383

8484
# make the mask
85-
group_index = self.sorted_labels[0]
86-
prev_stride = np.prod([len(x) for x in new_levels[1:]],
87-
dtype=int)
85+
group_index = np.zeros(len(self.index), dtype=int)
8886

89-
for lev, lab in zip(new_levels[1:], self.sorted_labels[1:-1]):
90-
group_index = group_index * prev_stride + lab
91-
prev_stride /= len(lev)
87+
for i in xrange(len(new_levels)):
88+
stride = np.prod([len(x) for x in new_levels[i+1:]],
89+
dtype=int)
90+
group_index += self.sorted_labels[i] * stride
9291

9392
group_mask = np.zeros(self.full_shape[0], dtype=bool)
9493
group_mask.put(group_index, True)

pandas/tests/test_multilevel.py

+14
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,20 @@ def test_stack_mixed_dtype(self):
336336
assert_series_equal(stacked['foo'], df['foo'].stack())
337337
self.assert_(stacked['bar'].dtype == np.float_)
338338

339+
def test_unstack_bug(self):
340+
df = DataFrame({'state': ['naive','naive','naive',
341+
'activ','activ','activ'],
342+
'exp':['a','b','b','b','a','a'],
343+
'barcode':[1,2,3,4,1,3],
344+
'v':['hi','hi','bye','bye','bye','peace'],
345+
'extra': np.arange(6.)})
346+
347+
result = df.groupby(['state','exp','barcode','v']).apply(len)
348+
unstacked = result.unstack()
349+
restacked = unstacked.stack()
350+
assert_series_equal(restacked,
351+
result.reindex(restacked.index).astype(float))
352+
339353
def test_swaplevel(self):
340354
swapped = self.frame['A'].swaplevel(0, 1)
341355
self.assert_(not swapped.index.equals(self.frame.index))

0 commit comments

Comments
 (0)