Skip to content

Commit be58573

Browse files
author
Chang She
committed
BUG: stacking with MultiIndex column with some unused level uniques fails pandas-dev#3170
1 parent 184f2db commit be58573

File tree

2 files changed

+21
-3
lines changed

2 files changed

+21
-3
lines changed

pandas/core/reshape.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ def get_new_values(self):
159159
dtype, fill_value = _maybe_promote(values.dtype)
160160
new_values = np.empty(result_shape, dtype=dtype)
161161
new_values.fill(fill_value)
162-
162+
163163
new_mask = np.zeros(result_shape, dtype=bool)
164164

165165
# is there a simpler / faster way of doing this?
@@ -508,9 +508,12 @@ def _stack_multi_columns(frame, level=-1, dropna=True):
508508
levsize = len(level_vals)
509509
for key in unique_groups:
510510
loc = this.columns.get_loc(key)
511-
511+
slice_len = loc.stop - loc.start
512512
# can make more efficient?
513-
if loc.stop - loc.start != levsize:
513+
514+
if slice_len == 0:
515+
continue
516+
elif slice_len != levsize:
514517
chunk = this.ix[:, this.columns[loc]]
515518
chunk.columns = level_vals.take(chunk.columns.labels[-1])
516519
value_slice = chunk.reindex(columns=level_vals).values

pandas/tests/test_multilevel.py

+15
Original file line numberDiff line numberDiff line change
@@ -930,6 +930,21 @@ def test_stack_unstack_multiple(self):
930930
expected = self.ymd.unstack(2).unstack(1).dropna(axis=1, how='all')
931931
assert_frame_equal(unstacked, expected.ix[:, unstacked.columns])
932932

933+
def test_stack_multiple_bug(self):
934+
""" bug when some uniques are not present in the data #3170"""
935+
id_col = ([1] * 3) + ([2] * 3)
936+
name = (['a'] * 3) + (['b'] * 3)
937+
date = pd.to_datetime(['2013-01-03', '2013-01-04', '2013-01-05'] * 2)
938+
var1 = np.random.randint(0, 100, 6)
939+
df = DataFrame(dict(ID=id_col, NAME=name, DATE=date, VAR1=var1))
940+
941+
multi = df.set_index(['DATE', 'ID'])
942+
unst = multi.unstack('ID')
943+
down = unst.resample('W-THU')
944+
945+
rs = down.stack('ID') # It works!
946+
947+
933948
def test_unstack_multiple_hierarchical(self):
934949
df = DataFrame(index=[[0, 0, 0, 0, 1, 1, 1, 1],
935950
[0, 0, 1, 1, 0, 0, 1, 1],

0 commit comments

Comments
 (0)