Skip to content

Commit 2c73bc1

Browse files
committed
ENH: Series.__repr__ tidying, don't print length if short
1 parent 62a5905 commit 2c73bc1

File tree

2 files changed

+34
-29
lines changed

2 files changed

+34
-29
lines changed

pandas/core/series.py

Lines changed: 32 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
# pylint: disable=E1101,E1103
66
# pylint: disable=W0703,W0622,W0613,W0201
77

8+
from itertools import izip
89
import csv
9-
import itertools
1010
import operator
1111

1212
from numpy import nan, ndarray
@@ -336,21 +336,23 @@ def __repr__(self):
336336
if len(self.index) > 500:
337337
result = self._tidy_repr(30)
338338
elif len(self.index) > 0:
339-
result = self._get_repr(name=True)
339+
result = self._get_repr(print_header=True,
340+
length=len(self) > 50,
341+
name=True)
340342
else:
341343
result = '%s' % ndarray.__repr__(self)
342344

343-
if self.index.name is not None:
344-
result = '%s\n%s' % (self.index.name, result)
345-
346345
return result
347346

348347
def _tidy_repr(self, max_vals=20):
349348
num = max_vals // 2
350-
head = self[:num]._get_repr(name=False)
351-
tail = self[-(max_vals - num):]._get_repr(name=False)
349+
head = self[:num]._get_repr(print_header=True, length=False,
350+
name=False)
351+
tail = self[-(max_vals - num):]._get_repr(print_header=False,
352+
length=False,
353+
name=False)
352354
result = head + '\n...\n' + tail
353-
namestr = ("Name: %s, " % self.name) if self.name else ""
355+
namestr = "Name: %s, " % self.name if self.name else ""
354356
result = '%s\n%sLength: %d' % (result, namestr, len(self))
355357
return result
356358

@@ -367,43 +369,46 @@ def to_string(self, buf=None, na_rep='NaN', nanRep=None):
367369
else:
368370
print >> buf, the_repr
369371

370-
def _get_repr(self, name=False, na_rep='NaN'):
372+
def _get_repr(self, name=False, print_header=False, length=True,
373+
na_rep='NaN'):
371374
vals = self.values
372375
index = self.index
373376

374377
is_multi = isinstance(index, MultiIndex)
375378
if is_multi:
379+
have_header = any(name for name in index.names)
376380
string_index = index.format(names=True)
377381
header, string_index = string_index[0], string_index[1:]
378382
else:
383+
have_header = index.name is not None
384+
header = index.name
379385
string_index = index.format()
380386

381387
maxlen = max(len(x) for x in string_index)
382388
padSpace = min(maxlen, 60)
383389

384-
def _format_float(k, v):
385-
if np.isnan(v):
390+
def _format(k, v):
391+
if isnull(v):
386392
v = na_rep
387-
else:
388-
v = str(v)
389393
return '%s %s' % (str(k).ljust(padSpace), v)
390394

391-
def _format_nonfloat(k, v):
392-
return '%s %s' % (str(k).ljust(padSpace), v)
393-
394-
if vals.dtype == np.float_:
395-
_format = _format_float
396-
else:
397-
_format = _format_nonfloat
395+
it = [_format(idx, v) for idx, v in izip(string_index, vals)]
398396

399-
it = itertools.starmap(_format,
400-
itertools.izip(string_index, vals))
401-
it = list(it)
402-
if is_multi and any(name for name in index.names):
397+
if print_header and have_header:
403398
it.insert(0, header)
399+
400+
footer = ''
404401
if name:
405-
namestr = ("Name: %s, " % self.name) if self.name else ""
406-
it.append('%sLength: %d' % (namestr, len(self)))
402+
footer += "Name: %s" % self.name if self.name else ''
403+
404+
if length:
405+
if footer:
406+
footer += ', '
407+
footer += 'Length: %d' % len(self)
408+
409+
if footer:
410+
it.append(footer)
411+
407412
return '\n'.join(it)
408413

409414
def __str__(self):
@@ -416,7 +421,7 @@ def iteritems(self):
416421
"""
417422
Lazily iterate over (index, value) tuples
418423
"""
419-
return itertools.izip(iter(self.index), iter(self))
424+
return izip(iter(self.index), iter(self))
420425

421426
iterkv = iteritems
422427
if py3compat.PY3: # pragma: no cover

pandas/tests/test_series.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,9 @@ def test_multilevel_name_print(self):
8282
"qux one 7",
8383
" two 8",
8484
" three 9",
85-
"Name: sth, Length: 10"]
85+
"Name: sth"]
8686
expected = "\n".join(expected)
87-
self.assertEquals(s.__repr__(), expected)
87+
self.assertEquals(repr(s), expected)
8888

8989
def test_multilevel_preserve_name(self):
9090
index = MultiIndex(levels=[['foo', 'bar', 'baz', 'qux'],

0 commit comments

Comments
 (0)