2017-12-19 2 views
1

나는 Point()이라는 클래스를 가지고 있으며, 포인트를 얻는 서비스에서 제공 한 JSON 대신 WKT가되도록하고 싶습니다.팬더가 올바르게 값을 시리즈에 표시하지 않음

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에서 클래스를 사용하려면 어떻게해야합니까? 대표 또는 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__을 기리는되지 않은 : 여기

내가보고하고 아주 기본적인 문제를 보여 다른 편집이다.

감사

파이썬에서, 당신이 여기 오버라이드 (override) 한 object에 내장 된 기능이 무엇인지
+0

수업에 대한 간단한 예를 들어 주시겠습니까? 당신의 df는 무엇으로 구성되어 있습니까? 당신은 그것이 그때 그것이 DataFrame 인 dict라고 말했습니까? 시리즈? – stucash

+0

더 견고한 예제를 추가했습니다. –

+0

감사합니다. 당신은 또한 당신의'_init_' 메소드에 대한 코드 에러를 가지고있다. 나는 그것을 편집했다. 그것은 자기 주장을 놓쳤다. 또한 귀하의 예제는 귀하가 진술 한 결과를 생성하지 않습니다. 파이썬 3에서는'SHAPE' 컬럼을위한 빈 배열입니다. – stucash

답변

1

것은 내가 팬더의 GitHub의 페이지로 이동했고, 그들이 사용하는 pprint 기능이 __str__을 존중하지 않는 개발팀에서 발견 또는 반복 가능한 객체에 __repr__. 따라서 dict에서 상속하면 사전에서 기본 인쇄물을 얻을 수 있습니다. 기본 솔루션은 dict에서 상속하지 않고 단지 기본 객체를 사용하는 것입니다.

0

. pandas은 그것에 대해 아무것도 모릅니다.

repl에서 G의 항목에 액세스하려고하면 올바른 오버 라이딩 된 출력이 나오는데, 이는 개체 수준에서 지시했기 때문입니다. 그러나 G 자체를 인쇄하려고하면 str(object) 또는 repr(object)이 아닌 개체 표현이 표시됩니다. 당신은 더 많은 here

에 repr (객체)

반환 객체의 인쇄 가능한 표현을 포함하는 문자열을 읽을 수 있습니다. 여러 유형의 경우이 함수는 eval()에 전달할 때 동일한 값을 가진 객체를 생성하는 문자열을 반환하려고 시도하지만, 그렇지 않은 경우 표현은 유형 이름을 포함하는 각도 괄호로 묶인 문자열입니다. 객체 함께 추가 정보는 종종 개체의 이름과 주소를 포함합니다. 클래스는 __repr__() 메서드를 정의하여 인스턴스에 대해이 함수가 반환 할 내용을 제어 할 수 있습니다. __repr__ 재정의 짧은

repr() 반환, 그것은 객체 표현을 조작 하지 무엇 조작합니다.

foo G 열은 여전히 ​​개체이며, str(foo)이 아닙니다.

그러므로 G를 str(object) 또는 repr(object)으로 지정해야합니다. 여기서 객체를 DataFrame에 줄 때 팬더는 객체 표현을 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 
+0

그래서 Panda의 github 페이지에서 좀 더 살펴 보았습니다. 내가 dict에서 상속 받았기 때문에 기본 pprint 함수가 키/값을 인쇄한다는 것을 알았습니다. –

+0

사실 나는 여기에 귀하의 질문에 맞습니다. 'dict'에서 상속을 제거하거나'str (point)'또는'repr (point)'를 할 수 있습니다; '__str__'과'__repr__'을 오버라이드하면'str (object)'와'repr (object)'도 대체합니다. – stucash

관련 문제