2014-01-30 2 views
1

이것은 Stackoverflow에 대한 재귀 질문이지만 아직 here 솔루션은 여전히 ​​완벽하지는 않습니다. Yielding은 (나를 위해) 파이썬에서 사용하는 가장 복잡한 것들 중 하나이기 때문에 직접 고치는 법을 모른다.팬더 데이터 프레임을 존중하는 파이썬 목록을 평평하게 (불규칙하게) 나열합니다.

함수에 주어진 목록 중 하나의 항목이 팬더 데이터 프레임이면 flatten 함수는 데이터 프레임 자체 대신 헤더를 반환합니다. 당신은 명시 적으로 다음 코드를 실행하여 테스트 할 수 있습니다 :

import pandas 
import collections 
df = pandas.DataFrame(np.random.randn(100, 4), columns=list('ABCD')) 

def flatten(l): 
    for el in l: 
     if isinstance(el, collections.Iterable) and not isinstance(el, basestring): 
      for sub in flatten(el): 
       yield sub 
     else: 
      yield el 

을 그런 다음 참조 된 게시물에 주어진 함수를 호출하는 경우 : 내부 dataframe와 목록을 반환하는 대신

list(flatten([df])) #['A', 'B', 'C', 'D'] 

합니다. 데이터 프레임을 평평하게 유지하는 기능을 만드는 방법은 무엇입니까? 요소가 collections.Iterable의 인스턴스이며,이 문자열이 아니라면 flatten 기능이 아래로 재귀 것이다

답변

3

(반복 가능하지만, 우리가 일반적으로 스칼라로 처리 할 뭔가 우리 내부보고하지 않을거야).

DataFramescollections.Iterable의 인스턴스인데도 말하자면 터미널처럼 보이기를 원합니다. 이 경우 :

if (isinstance(el, collections.Iterable) and 
     not isinstance(el, (basestring, pandas.DataFrame))): 

후 :

>>> list(flatten([[1,2], "2", df])) 
[1, 2, '2', <class 'pandas.core.frame.DataFrame'> 
Int64Index: 100 entries, 0 to 99 
Data columns (total 4 columns): 
A 100 non-null values 
B 100 non-null values 
C 100 non-null values 
D 100 non-null values 
+0

좋아요, 감사, 내가 검색 정확히 무엇인지. 원숭이 패치하는 법을 알았지 만 이것이 내가하는 일보다 더 우아하다. :) –

관련 문제