Skip to content

Commit 929c66f

Browse files
REF: repr - allow block to override values that get formatted (pandas-dev#17143)
1 parent 9b07ef4 commit 929c66f

File tree

7 files changed

+48
-2
lines changed

7 files changed

+48
-2
lines changed

pandas/core/internals.py

+8
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,10 @@ def internal_values(self, dtype=None):
160160
"""
161161
return self.values
162162

163+
def formatting_values(self):
164+
"""Return the internal values used by the DataFrame/SeriesFormatter"""
165+
return self.internal_values()
166+
163167
def get_values(self, dtype=None):
164168
"""
165169
return an internal format, currently just the ndarray
@@ -4317,6 +4321,10 @@ def external_values(self):
43174321
def internal_values(self):
43184322
return self._block.internal_values()
43194323

4324+
def formatting_values(self):
4325+
"""Return the internal values used by the DataFrame/SeriesFormatter"""
4326+
return self._block.formatting_values()
4327+
43204328
def get_values(self):
43214329
""" return a dense type view """
43224330
return np.array(self._block.to_dense(), copy=False)

pandas/core/series.py

+6
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,12 @@ def _values(self):
397397
""" return the internal repr of this data """
398398
return self._data.internal_values()
399399

400+
def _formatting_values(self):
401+
"""Return the values that can be formatted (used by SeriesFormatter
402+
and DataFrameFormatter)
403+
"""
404+
return self._data.formatting_values()
405+
400406
def get_values(self):
401407
""" same as values (but handles sparseness conversions); is a view """
402408
return self._data.get_values()

pandas/io/formats/format.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,8 @@ def _get_formatted_index(self):
237237
return fmt_index, have_header
238238

239239
def _get_formatted_values(self):
240-
return format_array(self.tr_series._values, None,
240+
values_to_format = self.tr_series._formatting_values()
241+
return format_array(values_to_format, None,
241242
float_format=self.float_format, na_rep=self.na_rep)
242243

243244
def to_string(self):
@@ -694,7 +695,8 @@ def to_latex(self, column_format=None, longtable=False, encoding=None,
694695
def _format_col(self, i):
695696
frame = self.tr_frame
696697
formatter = self._get_formatter(i)
697-
return format_array(frame.iloc[:, i]._values, formatter,
698+
values_to_format = frame.iloc[:, i]._formatting_values()
699+
return format_array(values_to_format, formatter,
698700
float_format=self.float_format, na_rep=self.na_rep,
699701
space=self.col_space, decimal=self.decimal)
700702

pandas/tests/internals/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# -*- coding: utf-8 -*-
2+
# pylint: disable=W0102
3+
4+
import numpy as np
5+
6+
import pandas as pd
7+
from pandas.core.internals import Block, BlockManager, SingleBlockManager
8+
9+
10+
class CustomBlock(Block):
11+
12+
def formatting_values(self):
13+
return np.array(["Val: {}".format(i) for i in self.values])
14+
15+
16+
def test_custom_repr():
17+
values = np.arange(3, dtype='int64')
18+
19+
# series
20+
block = CustomBlock(values, placement=slice(0, 3))
21+
22+
s = pd.Series(SingleBlockManager(block, pd.RangeIndex(3)))
23+
assert repr(s) == '0 Val: 0\n1 Val: 1\n2 Val: 2\ndtype: int64'
24+
25+
# dataframe
26+
block = CustomBlock(values.reshape(1, -1), placement=slice(0, 1))
27+
blk_mgr = BlockManager([block], [['col'], range(3)])
28+
df = pd.DataFrame(blk_mgr)
29+
assert repr(df) == ' col\n0 Val: 0\n1 Val: 1\n2 Val: 2'

setup.py

+1
Original file line numberDiff line numberDiff line change
@@ -670,6 +670,7 @@ def pxd(name):
670670
'pandas.tests.indexes.datetimes',
671671
'pandas.tests.indexes.timedeltas',
672672
'pandas.tests.indexes.period',
673+
'pandas.tests.internals',
673674
'pandas.tests.io',
674675
'pandas.tests.io.json',
675676
'pandas.tests.io.parser',

0 commit comments

Comments
 (0)