Skip to content

Commit a37e666

Browse files
committed
BUG: convert tuples in concat to MultiIndex
1 parent 9cd3e49 commit a37e666

File tree

3 files changed

+25
-11
lines changed

3 files changed

+25
-11
lines changed

pandas/tools/merge.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -864,24 +864,25 @@ def _concat_indexes(indexes):
864864
return indexes[0].append(indexes[1:])
865865

866866
def _make_concat_multiindex(indexes, keys, levels=None, names=None):
867-
single_level = levels is None or len(levels) == 1
867+
if ((levels is None and isinstance(keys[0], tuple)) or
868+
(levels is not None and len(levels) > 1)):
869+
zipped = zip(*keys)
870+
if names is None:
871+
names = [None] * len(zipped)
868872

869-
if single_level:
873+
if levels is None:
874+
levels = [Factor(zp).levels for zp in zipped]
875+
else:
876+
levels = [_ensure_index(x) for x in levels]
877+
else:
870878
zipped = [keys]
871879
if names is None:
872880
names = [None]
873-
else:
874-
zipped = zip(*keys)
875-
if names is None:
876-
names = [None] * len(zipped)
877881

878-
if levels is None:
879-
if single_level:
882+
if levels is None:
880883
levels = [_ensure_index(keys)]
881884
else:
882-
levels = [Factor(zp).levels for zp in zipped]
883-
else:
884-
levels = [_ensure_index(x) for x in levels]
885+
levels = [_ensure_index(x) for x in levels]
885886

886887
if not _all_indexes_same(indexes):
887888
label_list = []

pandas/tools/tests/test_merge.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -865,6 +865,14 @@ def test_concat_keys_and_levels(self):
865865
levels=levels)
866866
self.assertEqual(result.index.names, [None] * 3)
867867

868+
# no levels
869+
result = concat([df, df2, df, df2],
870+
keys=[('foo', 'one'), ('foo', 'two'),
871+
('baz', 'one'), ('baz', 'two')],
872+
names=['first', 'second'])
873+
self.assertEqual(result.index.names, ['first', 'second'] + [None])
874+
self.assert_(np.array_equal(result.index.levels[0], ['baz', 'foo']))
875+
868876
def test_crossed_dtypes_weird_corner(self):
869877
columns = ['A', 'B', 'C', 'D']
870878
df1 = DataFrame({'A' : np.array([1, 2, 3, 4], dtype='f8'),

pandas/tools/tests/test_pivot.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,11 @@ def test_crosstab_ndarray(self):
178178
expected = crosstab([df['b'], df['c']], df['a'])
179179
tm.assert_frame_equal(result, expected)
180180

181+
# assign arbitrary names
182+
result = crosstab(self.df['A'].values, self.df['C'].values)
183+
self.assertEqual(result.index.name, 'row_0')
184+
self.assertEqual(result.columns.name, 'col_0')
185+
181186
def test_crosstab_margins(self):
182187
a = np.random.randint(0, 7, size=100)
183188
b = np.random.randint(0, 3, size=100)

0 commit comments

Comments
 (0)