我有一个名为Point()
的类,我希望打印输出为WKT而不是从它获得的服务中提供的JSON。
Point类继承自dict,除了在ipython中显示列或打印数据框对象外,类中的所有内容都很有效。
我在Point类(简化类)上尝试了以下内容:
class Point(dict):
def __init__(self, iterable):
self._coords = iterable
def __str__(self):
return 'Point(%s,%s)' % (self._coords['x'], self._coords['y'])
def __repr__(self):
return 'Point(%s,%s)' % (self.x, self.y)
def _repr_html_(self):
return self.__str__()
def _repr_pretty_(self):
return self.__str__()
示例:
>>> pt = Point({"x" : -118.15, "y" : 33.80, "spatialReference" : {"wkid" : 4326}})
>>> df = pd.DataFrame(data=[['A', pt]], columns=['foo', 'SHAPE'])
>>> df.SHAPE
foo SHAPE
0 A {'x': -118.15, 'y': 33.8, 'spatialReference': ...
但如果我这样做
>>> df.SHAPE[0]
"POINT (-118.15000000000001 33.799999999999997)"
哪个是正确的所需输出。
如何让DataFrame兑现我的课程 repr 或 str ?
这是另一个显示我看到的非常基本问题的编辑:
class foo(dict):
def __init__(self, iterable=None, **kwargs):
if iterable is None:
iterable = ()
super(foo, self).__init__(iterable)
self.update(kwargs)
def __repr__(self):
return ",".join(self.keys())
def __str__(self):
return ",".join(self.keys())
f = foo({'alpha' : 'b',
'beta' : 'c'})
import pandas as pd
pd.DataFrame(data=[['A', 1, f]], columns=['D', 'F', 'G'])
系列“G”的输出不符合课程__repr__
或__str__
。
由于
答案 0 :(得分:1)
我必须转到Pandas的github页面,并从开发团队中发现他们使用的pprint函数不会对可迭代对象表示__str__
或__repr__
。因此,如果您继承自 dict ,您将从字典中获取默认打印。基本的解决方案是不从dict继承而只使用默认对象。
答案 1 :(得分:0)
你在这里重写的是python中object
的内置函数。 pandas
对此一无所知。
正确的是,当您尝试在repl
中访问G中的项时,您将获得正确的覆盖输出,因为这是您在对象级别所指示的内容。但是当您尝试打印G
本身时,您将获得的对象表示不是str(object)
或repr(object)
。你可以阅读更多here
repr(对象)
返回包含可打印表示形式的字符串 一个东西。对于许多类型,此函数尝试返回a 传递给将产生具有相同值的对象的字符串 eval(),否则表示是一个以角度包围的字符串 包含对象类型名称的括号 附加信息通常包括名称和地址 物体。类可以控制此函数为其返回的内容 实例通过定义
__repr__()
方法。
简而言之,覆盖__repr__
操纵repr()
返回的内容,不操纵对象表示。
foo
仍然是对象,它们不是str(foo)
。
因此,您需要将str(object)
或repr(object)
作为其项目。
您在此假设当您将对象提供给DataFrame
时,pandas会自动将对象表示转换为str(object)
或repr(object)
。在这种情况下不是。
初步尝试获得所需的结果,您可以这样做:
import pandas as pd
df = pd.DataFrame(data=[['A', 1, str(f)]], columns=['D', 'F', 'G'])
print(df)
# output
D F G
0 A 1 alpha, beta