Skip to content

Commit e038845

Browse files
committed
Merge pull request #2930 from jreback/series_format
BUG: formatting for Series was printing multiple Dtype lines for long display
2 parents d94ff14 + a78c1a0 commit e038845

File tree

3 files changed

+31
-23
lines changed

3 files changed

+31
-23
lines changed

pandas/core/format.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,14 @@
6565

6666
class SeriesFormatter(object):
6767

68-
def __init__(self, series, buf=None, header=True, length=True,
69-
na_rep='NaN', name=False, float_format=None, dtype=True):
68+
def __init__(self, series, buf=None, header=True, length=True, dtype=True,
69+
na_rep='NaN', name=False, float_format=None):
7070
self.series = series
7171
self.buf = buf if buf is not None else StringIO(u"")
7272
self.name = name
73-
self.dtype = dtype
7473
self.na_rep = na_rep
7574
self.length = length
75+
self.dtype = dtype
7676
self.header = header
7777

7878
if float_format is None:

pandas/core/series.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,9 +1047,10 @@ def __unicode__(self):
10471047
elif len(self.index) > 0:
10481048
result = self._get_repr(print_header=True,
10491049
length=len(self) > 50,
1050-
name=True)
1050+
name=True,
1051+
dtype=True)
10511052
else:
1052-
result = u'Series([], dtype=%s)' % self.dtype
1053+
result = u'Series([], Dtype: %s)' % self.dtype
10531054

10541055
assert type(result) == unicode
10551056
return result
@@ -1069,9 +1070,10 @@ def _tidy_repr(self, max_vals=20):
10691070
"""
10701071
num = max_vals // 2
10711072
head = self[:num]._get_repr(print_header=True, length=False,
1072-
name=False)
1073+
dtype=False, name=False)
10731074
tail = self[-(max_vals - num):]._get_repr(print_header=False,
10741075
length=False,
1076+
dtype=False,
10751077
name=False)
10761078
result = head + '\n...\n' + tail
10771079
result = '%s\n%s' % (result, self._repr_footer())
@@ -1085,7 +1087,7 @@ def _repr_footer(self):
10851087
com.pprint_thing(self.dtype.name))
10861088

10871089
def to_string(self, buf=None, na_rep='NaN', float_format=None,
1088-
nanRep=None, length=False, name=False):
1090+
nanRep=None, length=False, dtype=False, name=False):
10891091
"""
10901092
Render a string representation of the Series
10911093
@@ -1100,6 +1102,8 @@ def to_string(self, buf=None, na_rep='NaN', float_format=None,
11001102
default None
11011103
length : boolean, default False
11021104
Add the Series length
1105+
dtype : boolean, default False
1106+
Add the Series dtype
11031107
name : boolean, default False
11041108
Add the Series name (which may be None)
11051109
@@ -1114,7 +1118,7 @@ def to_string(self, buf=None, na_rep='NaN', float_format=None,
11141118
na_rep = nanRep
11151119

11161120
the_repr = self._get_repr(float_format=float_format, na_rep=na_rep,
1117-
length=length, name=name)
1121+
length=length, dtype=dtype, name=name)
11181122

11191123
assert type(the_repr) == unicode
11201124

@@ -1123,15 +1127,15 @@ def to_string(self, buf=None, na_rep='NaN', float_format=None,
11231127
else:
11241128
print >> buf, the_repr
11251129

1126-
def _get_repr(self, name=False, print_header=False, length=True,
1130+
def _get_repr(self, name=False, print_header=False, length=True, dtype=True,
11271131
na_rep='NaN', float_format=None):
11281132
"""
11291133
11301134
Internal function, should always return unicode string
11311135
"""
11321136

11331137
formatter = fmt.SeriesFormatter(self, name=name, header=print_header,
1134-
length=length, na_rep=na_rep,
1138+
length=length, dtype=dtype, na_rep=na_rep,
11351139
float_format=float_format)
11361140
result = formatter.to_string()
11371141
assert type(result) == unicode
@@ -3287,7 +3291,8 @@ def _repr_footer(self):
32873291

32883292
namestr = "Name: %s, " % str(
32893293
self.name) if self.name is not None else ""
3290-
return '%s%sLength: %d' % (freqstr, namestr, len(self))
3294+
return '%s%sLength: %d, Dtype: %s' % (freqstr, namestr, len(self),
3295+
com.pprint_thing(self.dtype.name))
32913296

32923297
def to_timestamp(self, freq=None, how='start', copy=True):
32933298
"""

pandas/tests/test_format.py

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,15 @@ def test_wide_repr_wide_long_columns(self):
585585
self.assertTrue('ccccc' in result)
586586
self.assertTrue('ddddd' in result)
587587

588+
def test_long_series(self):
589+
n = 1000
590+
s = Series(np.random.randint(-50,50,n),index=['s%04d' % x for x in xrange(n)], dtype='int64')
591+
592+
import re
593+
str_rep = str(s)
594+
nmatches = len(re.findall('Dtype',str_rep))
595+
self.assert_(nmatches == 1)
596+
588597
def test_to_string(self):
589598
from pandas import read_table
590599
import re
@@ -1119,7 +1128,7 @@ def test_to_string(self):
11191128
format = '%.4f'.__mod__
11201129
result = self.ts.to_string(float_format=format)
11211130
result = [x.split()[1] for x in result.split('\n')]
1122-
expected = [format(x) for x in self.ts] + [u'float64']
1131+
expected = [format(x) for x in self.ts]
11231132
self.assertEqual(result, expected)
11241133

11251134
# empty string
@@ -1132,7 +1141,7 @@ def test_to_string(self):
11321141
# name and length
11331142
cp = self.ts.copy()
11341143
cp.name = 'foo'
1135-
result = cp.to_string(length=True, name=True)
1144+
result = cp.to_string(length=True, name=True, dtype=True)
11361145
last_line = result.split('\n')[-1].strip()
11371146
self.assertEqual(last_line, "Freq: B, Name: foo, Length: %d, Dtype: float64" % len(cp))
11381147

@@ -1149,8 +1158,7 @@ def test_to_string_mixed(self):
11491158
expected = (u'0 foo\n'
11501159
u'1 NaN\n'
11511160
u'2 -1.23\n'
1152-
u'3 4.56\n'
1153-
u'Dtype: object')
1161+
u'3 4.56')
11541162
self.assertEqual(result, expected)
11551163

11561164
# but don't count NAs as floats
@@ -1159,17 +1167,15 @@ def test_to_string_mixed(self):
11591167
expected = (u'0 foo\n'
11601168
'1 NaN\n'
11611169
'2 bar\n'
1162-
'3 baz\n'
1163-
u'Dtype: object')
1170+
'3 baz')
11641171
self.assertEqual(result, expected)
11651172

11661173
s = Series(['foo', 5, 'bar', 'baz'])
11671174
result = s.to_string()
11681175
expected = (u'0 foo\n'
11691176
'1 5\n'
11701177
'2 bar\n'
1171-
'3 baz\n'
1172-
u'Dtype: object')
1178+
'3 baz')
11731179
self.assertEqual(result, expected)
11741180

11751181
def test_to_string_float_na_spacing(self):
@@ -1181,8 +1187,7 @@ def test_to_string_float_na_spacing(self):
11811187
'1 1.5678\n'
11821188
'2 NaN\n'
11831189
'3 -3.0000\n'
1184-
'4 NaN\n'
1185-
u'Dtype: float64')
1190+
'4 NaN')
11861191
self.assertEqual(result, expected)
11871192

11881193
def test_unicode_name_in_footer(self):
@@ -1216,14 +1221,12 @@ def test_timedelta64(self):
12161221
result = y.to_string()
12171222
self.assertTrue('1 days, 00:00:00' in result)
12181223
self.assertTrue('NaT' in result)
1219-
self.assertTrue('timedelta64[ns]' in result)
12201224

12211225
# with frac seconds
12221226
s = Series(date_range('2012-1-1', periods=3, freq='D'))
12231227
y = s-datetime(2012,1,1,microsecond=150)
12241228
result = y.to_string()
12251229
self.assertTrue('00:00:00.000150' in result)
1226-
self.assertTrue('timedelta64[ns]' in result)
12271230

12281231
def test_mixed_datetime64(self):
12291232
df = DataFrame({'A': [1, 2],

0 commit comments

Comments
 (0)