From a78c1a00d074585f00c7affcba632a835fdbded9 Mon Sep 17 00:00:00 2001 From: jreback Date: Mon, 25 Feb 2013 16:55:35 -0500 Subject: [PATCH] BUG: formatting for Series printing was multiple Dtype lines --- pandas/core/format.py | 6 +++--- pandas/core/series.py | 21 +++++++++++++-------- pandas/tests/test_format.py | 27 +++++++++++++++------------ 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/pandas/core/format.py b/pandas/core/format.py index b4a6ac59719b5..c564bb37a18f7 100644 --- a/pandas/core/format.py +++ b/pandas/core/format.py @@ -65,14 +65,14 @@ class SeriesFormatter(object): - def __init__(self, series, buf=None, header=True, length=True, - na_rep='NaN', name=False, float_format=None, dtype=True): + def __init__(self, series, buf=None, header=True, length=True, dtype=True, + na_rep='NaN', name=False, float_format=None): self.series = series self.buf = buf if buf is not None else StringIO(u"") self.name = name - self.dtype = dtype self.na_rep = na_rep self.length = length + self.dtype = dtype self.header = header if float_format is None: diff --git a/pandas/core/series.py b/pandas/core/series.py index 041e708d7a907..317806b9de3b7 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -1047,9 +1047,10 @@ def __unicode__(self): elif len(self.index) > 0: result = self._get_repr(print_header=True, length=len(self) > 50, - name=True) + name=True, + dtype=True) else: - result = u'Series([], dtype=%s)' % self.dtype + result = u'Series([], Dtype: %s)' % self.dtype assert type(result) == unicode return result @@ -1069,9 +1070,10 @@ def _tidy_repr(self, max_vals=20): """ num = max_vals // 2 head = self[:num]._get_repr(print_header=True, length=False, - name=False) + dtype=False, name=False) tail = self[-(max_vals - num):]._get_repr(print_header=False, length=False, + dtype=False, name=False) result = head + '\n...\n' + tail result = '%s\n%s' % (result, self._repr_footer()) @@ -1085,7 +1087,7 @@ def _repr_footer(self): com.pprint_thing(self.dtype.name)) def to_string(self, buf=None, na_rep='NaN', float_format=None, - nanRep=None, length=False, name=False): + nanRep=None, length=False, dtype=False, name=False): """ Render a string representation of the Series @@ -1100,6 +1102,8 @@ def to_string(self, buf=None, na_rep='NaN', float_format=None, default None length : boolean, default False Add the Series length + dtype : boolean, default False + Add the Series dtype name : boolean, default False Add the Series name (which may be None) @@ -1114,7 +1118,7 @@ def to_string(self, buf=None, na_rep='NaN', float_format=None, na_rep = nanRep the_repr = self._get_repr(float_format=float_format, na_rep=na_rep, - length=length, name=name) + length=length, dtype=dtype, name=name) assert type(the_repr) == unicode @@ -1123,7 +1127,7 @@ def to_string(self, buf=None, na_rep='NaN', float_format=None, else: print >> buf, the_repr - def _get_repr(self, name=False, print_header=False, length=True, + def _get_repr(self, name=False, print_header=False, length=True, dtype=True, na_rep='NaN', float_format=None): """ @@ -1131,7 +1135,7 @@ def _get_repr(self, name=False, print_header=False, length=True, """ formatter = fmt.SeriesFormatter(self, name=name, header=print_header, - length=length, na_rep=na_rep, + length=length, dtype=dtype, na_rep=na_rep, float_format=float_format) result = formatter.to_string() assert type(result) == unicode @@ -3287,7 +3291,8 @@ def _repr_footer(self): namestr = "Name: %s, " % str( self.name) if self.name is not None else "" - return '%s%sLength: %d' % (freqstr, namestr, len(self)) + return '%s%sLength: %d, Dtype: %s' % (freqstr, namestr, len(self), + com.pprint_thing(self.dtype.name)) def to_timestamp(self, freq=None, how='start', copy=True): """ diff --git a/pandas/tests/test_format.py b/pandas/tests/test_format.py index 4f91b88291a3d..739bea41256df 100644 --- a/pandas/tests/test_format.py +++ b/pandas/tests/test_format.py @@ -585,6 +585,15 @@ def test_wide_repr_wide_long_columns(self): self.assertTrue('ccccc' in result) self.assertTrue('ddddd' in result) + def test_long_series(self): + n = 1000 + s = Series(np.random.randint(-50,50,n),index=['s%04d' % x for x in xrange(n)], dtype='int64') + + import re + str_rep = str(s) + nmatches = len(re.findall('Dtype',str_rep)) + self.assert_(nmatches == 1) + def test_to_string(self): from pandas import read_table import re @@ -1119,7 +1128,7 @@ def test_to_string(self): format = '%.4f'.__mod__ result = self.ts.to_string(float_format=format) result = [x.split()[1] for x in result.split('\n')] - expected = [format(x) for x in self.ts] + [u'float64'] + expected = [format(x) for x in self.ts] self.assertEqual(result, expected) # empty string @@ -1132,7 +1141,7 @@ def test_to_string(self): # name and length cp = self.ts.copy() cp.name = 'foo' - result = cp.to_string(length=True, name=True) + result = cp.to_string(length=True, name=True, dtype=True) last_line = result.split('\n')[-1].strip() self.assertEqual(last_line, "Freq: B, Name: foo, Length: %d, Dtype: float64" % len(cp)) @@ -1149,8 +1158,7 @@ def test_to_string_mixed(self): expected = (u'0 foo\n' u'1 NaN\n' u'2 -1.23\n' - u'3 4.56\n' - u'Dtype: object') + u'3 4.56') self.assertEqual(result, expected) # but don't count NAs as floats @@ -1159,8 +1167,7 @@ def test_to_string_mixed(self): expected = (u'0 foo\n' '1 NaN\n' '2 bar\n' - '3 baz\n' - u'Dtype: object') + '3 baz') self.assertEqual(result, expected) s = Series(['foo', 5, 'bar', 'baz']) @@ -1168,8 +1175,7 @@ def test_to_string_mixed(self): expected = (u'0 foo\n' '1 5\n' '2 bar\n' - '3 baz\n' - u'Dtype: object') + '3 baz') self.assertEqual(result, expected) def test_to_string_float_na_spacing(self): @@ -1181,8 +1187,7 @@ def test_to_string_float_na_spacing(self): '1 1.5678\n' '2 NaN\n' '3 -3.0000\n' - '4 NaN\n' - u'Dtype: float64') + '4 NaN') self.assertEqual(result, expected) def test_unicode_name_in_footer(self): @@ -1216,14 +1221,12 @@ def test_timedelta64(self): result = y.to_string() self.assertTrue('1 days, 00:00:00' in result) self.assertTrue('NaT' in result) - self.assertTrue('timedelta64[ns]' in result) # with frac seconds s = Series(date_range('2012-1-1', periods=3, freq='D')) y = s-datetime(2012,1,1,microsecond=150) result = y.to_string() self.assertTrue('00:00:00.000150' in result) - self.assertTrue('timedelta64[ns]' in result) def test_mixed_datetime64(self): df = DataFrame({'A': [1, 2],