Open achapkowski opened 6 years ago
This is probably the same as https://github.com/pandas-dev/pandas/issues/17695 (you inherit from dict, so your objects are iterable). It's difficult for pandas to support formatting arbitrary objects.
Your simple example could be solved by not subclassing dict, and just storing your iterable
on an internal ._data
attribute. But that likely isn't a solution for your real problem.
@TomAugspurger not subclassing from dict is not an option since the other classes are established. Is there a way to override the print function (not optimal) or set something on the class to say hey use the __repr__
I don't believe so.
On Tue, Dec 19, 2017 at 10:12 AM, Andrew notifications@github.com wrote:
@TomAugspurger https://github.com/tomaugspurger not subclassing from dict is not an option since the other classes are established. Is there a way to override the print function (not optimal) or set something on the class to say hey use the repr
— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/pandas-dev/pandas/issues/18843#issuecomment-352806018, or mute the thread https://github.com/notifications/unsubscribe-auth/ABQHItEhFKxDvFpUMKyvOT-jdLtIstdeks5tB-BlgaJpZM4RHJWu .
In pprint_thing
, why is hasattr(thing, '__next__')
a special case?
https://github.com/pandas-dev/pandas/blob/cfd65e98e694b2ad40e97d06ffdd9096a3dea909/pandas/io/formats/printing.py#L207
Bump to @jamesmyatt's question: why is hasattr(thing, '__next__')
a special case in pprint_thing?
__next__
attribute is available in iterators, and it doesn't make sense why iterator objects would be printed directly using str
and other kinds of objects are passed through as_escaped_unicode
function before printing.
Quick dirty patch for those who cannot wait for the fix:
from pandas.io.formats import printing as pd_printing
pd_printing.is_sequence = lambda obj: False
@rajeee, @jamesmyatt not sure about why that check is there, a well-tested PR trying to fix this issue by removing that would be a next step here if you (or anyone else) is interested!
This bug is no longer a bug:
Out[48]:
D F G
0 A 1 {'alpha': 'b', 'beta': 'c'}
But a similar issue arrises when you sub-class Mapping
(but not dict
). A Mapping
is a Collection
is a Iterable
and a Sized
which define, respectively, __iter__
and __len__
, which triggers Pandas' special logic.
We could change the isinstance
check to use isinstance(value, Mapping)
but then our custom mappings will look like dicts. This still seems like an improvement over only seeing the keys.
It does seem a lot easier to just override is_sequence
to ignore our custom classes.
I have a similar problem, that pandas tries to interpret my custom class either as a list or as a dict, but does not allow to use a simple string representation.
My work-around was to define a __next__
-Method, because this seems to short-cut directly to str
.
@ruema can you post a full example?
Here's an example of an object with and without the __next__
-Methode.
from collections import namedtuple
import pandas as pd
Point = namedtuple("Point", "x,y")
series = pd.Series({'pos': Point(7, 3)})
print(series)
# pos (7, 3)
# dtype: object
class Point(namedtuple("Point", "x,y")):
__next__ = None
series = pd.Series({'pos': Point(7, 3)})
print(series)
# pos Point(x=7, y=3)
# dtype: object
I wonder, whether pandas pretty printing is helpful for anything but lists and tuples.
100% they should honor repr or str dunders
Code Sample, a copy-pastable example if possible
Problem description
For a given series with a custom object, I want to control the content when displayed via print or displaying on ipython notebooks. The object
foo
is a simple class that have the__str__
and__repr__
overwritten, but still displays the object's dictionary content, not the view I want to show the end users. How do I control that?Expected Output
alpha,beta
what I get is:
{'alpha': 'b', 'beta': 'c'}
Output of
pd.show_versions()