Skip to content

Commit 1fafe76

Browse files
committed
Merge pull request #9806 from tomazberisa/df-display-bug
BUG: format small floats correctly (GH9764)
2 parents e9179fe + ce988b4 commit 1fafe76

File tree

3 files changed

+21
-1
lines changed

3 files changed

+21
-1
lines changed

doc/source/whatsnew/v0.16.1.txt

+1
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,4 @@ Bug Fixes
8181

8282
- Bug in ``Series.quantile`` on empty Series of type ``Datetime`` or ``Timedelta`` (:issue:`9675`)
8383
- Bug in ``where`` causing incorrect results when upcasting was required (:issue:`9731`)
84+
- Bug in ``FloatArrayFormatter`` where decision boundary for displaying "small" floats in decimal format is off by one order of magnitude for a given display.precision (:issue:`9764`)

pandas/core/format.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1996,7 +1996,7 @@ def _format_strings(self):
19961996

19971997
# this is pretty arbitrary for now
19981998
has_large_values = (abs_vals > 1e8).any()
1999-
has_small_values = ((abs_vals < 10 ** (-self.digits)) &
1999+
has_small_values = ((abs_vals < 10 ** (-self.digits+1)) &
20002000
(abs_vals > 0)).any()
20012001

20022002
if too_long and has_large_values:

pandas/tests/test_format.py

+19
Original file line numberDiff line numberDiff line change
@@ -2986,6 +2986,25 @@ def test_format(self):
29862986
self.assertEqual(result[0], " 12")
29872987
self.assertEqual(result[1], " 0")
29882988

2989+
def test_output_significant_digits(self):
2990+
# Issue #9764
2991+
2992+
# In case default display precision changes:
2993+
with pd.option_context('display.precision', 7):
2994+
# DataFrame example from issue #9764
2995+
d=pd.DataFrame({'col1':[9.999e-8, 1e-7, 1.0001e-7, 2e-7, 4.999e-7, 5e-7, 5.0001e-7, 6e-7, 9.999e-7, 1e-6, 1.0001e-6, 2e-6, 4.999e-6, 5e-6, 5.0001e-6, 6e-6]})
2996+
2997+
expected_output={
2998+
(0,6):' col1\n0 9.999000e-08\n1 1.000000e-07\n2 1.000100e-07\n3 2.000000e-07\n4 4.999000e-07\n5 5.000000e-07',
2999+
(1,6):' col1\n1 1.000000e-07\n2 1.000100e-07\n3 2.000000e-07\n4 4.999000e-07\n5 5.000000e-07',
3000+
(1,8):' col1\n1 1.000000e-07\n2 1.000100e-07\n3 2.000000e-07\n4 4.999000e-07\n5 5.000000e-07\n6 5.000100e-07\n7 6.000000e-07',
3001+
(8,16):' col1\n8 9.999000e-07\n9 1.000000e-06\n10 1.000100e-06\n11 2.000000e-06\n12 4.999000e-06\n13 5.000000e-06\n14 5.000100e-06\n15 6.000000e-06',
3002+
(9,16):' col1\n9 0.000001\n10 0.000001\n11 0.000002\n12 0.000005\n13 0.000005\n14 0.000005\n15 0.000006'
3003+
}
3004+
3005+
for (start, stop), v in expected_output.items():
3006+
self.assertEqual(str(d[start:stop]), v)
3007+
29893008

29903009
class TestRepr_timedelta64(tm.TestCase):
29913010

0 commit comments

Comments
 (0)