大熊猫没有正确显示系列值

时间:2017-12-19 15:01:42

标签: python pandas repr

我有一个名为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__

由于

2 个答案:

答案 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()返回的内容,操纵对象表示。

G列中的

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