We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
1 parent 527f64a commit 3fc528cCopy full SHA for 3fc528c
pandas/core/reshape.py
@@ -82,13 +82,12 @@ def _make_selectors(self):
82
new_levels = self.new_index_levels
83
84
# 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)
+ group_index = np.zeros(len(self.index), dtype=int)
88
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)
+ for i in xrange(len(new_levels)):
+ stride = np.prod([len(x) for x in new_levels[i+1:]],
+ dtype=int)
+ group_index += self.sorted_labels[i] * stride
92
93
group_mask = np.zeros(self.full_shape[0], dtype=bool)
94
group_mask.put(group_index, True)
pandas/tests/test_multilevel.py
@@ -336,6 +336,20 @@ def test_stack_mixed_dtype(self):
336
assert_series_equal(stacked['foo'], df['foo'].stack())
337
self.assert_(stacked['bar'].dtype == np.float_)
338
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
353
def test_swaplevel(self):
354
swapped = self.frame['A'].swaplevel(0, 1)
355
self.assert_(not swapped.index.equals(self.frame.index))
0 commit comments