From 6804ae949e37b17140e9fa2b3194c7e44d946378 Mon Sep 17 00:00:00 2001 From: Adam Klein Date: Fri, 4 Nov 2011 15:41:02 -0400 Subject: [PATCH 1/2] ENH: Print hierarchical index names in Series.__repr__ --- pandas/core/series.py | 10 +++++++++- pandas/tests/test_series.py | 22 ++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/pandas/core/series.py b/pandas/core/series.py index b606ae229414b..56f0e36c1c6b3 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -405,7 +405,13 @@ def _get_repr(self, name=False, na_rep='NaN'): vals = self.values index = self.index - string_index = index.format() + is_multi = isinstance(index, MultiIndex) + if is_multi: + string_index = index.format(names=True) + header, string_index = string_index[0], string_index[1:] + else: + string_index = index.format() + maxlen = max(len(x) for x in string_index) padSpace = min(maxlen, 60) @@ -427,6 +433,8 @@ def _format_nonfloat(k, v): it = itertools.starmap(_format, itertools.izip(string_index, vals)) it = list(it) + if is_multi: + it.insert(0, header) if name: namestr = ("Name: %s, " % self.name) if self.name else "" it.append('%sLength: %d' % (namestr, len(self))) diff --git a/pandas/tests/test_series.py b/pandas/tests/test_series.py index 83046a1b2d269..d49af004286c4 100644 --- a/pandas/tests/test_series.py +++ b/pandas/tests/test_series.py @@ -64,6 +64,28 @@ def test_getitem_preserve_name(self): result = self.ts[5:10] self.assertEquals(result.name, self.ts.name) + def test_multilevel_name_print(self): + index = MultiIndex(levels=[['foo', 'bar', 'baz', 'qux'], + ['one', 'two', 'three']], + labels=[[0, 0, 0, 1, 1, 2, 2, 3, 3, 3], + [0, 1, 2, 0, 1, 1, 2, 0, 1, 2]], + names=['first', 'second']) + s = Series(range(0,len(index)), index=index, name='sth') + expected = ["first second", + "foo one 0", + " two 1", + " three 2", + "bar one 3", + " two 4", + "baz two 5", + " three 6", + "qux one 7", + " two 8", + " three 9", + "Name: sth, Length: 10"] + expected = "\n".join(expected) + self.assertEquals(s.__repr__(), expected) + def test_multilevel_preserve_name(self): index = MultiIndex(levels=[['foo', 'bar', 'baz', 'qux'], ['one', 'two', 'three']], From c85c61044ae2173b559bc8cb9968f0f01cec8317 Mon Sep 17 00:00:00 2001 From: Adam Klein Date: Fri, 4 Nov 2011 16:07:26 -0400 Subject: [PATCH 2/2] fixed no-name condition in multilevel index printing for series --- pandas/core/series.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/series.py b/pandas/core/series.py index 56f0e36c1c6b3..a50dd9d3764d3 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -433,7 +433,7 @@ def _format_nonfloat(k, v): it = itertools.starmap(_format, itertools.izip(string_index, vals)) it = list(it) - if is_multi: + if is_multi and any(name for name in index.names): it.insert(0, header) if name: namestr = ("Name: %s, " % self.name) if self.name else ""