2013-06-11 2 views
2

더 나은 문제를 설명하기 위해 팬더 라이브러리를 사용하여 몇 가지 특성을 설명 하겠지만 제목에 명시된 것처럼 질문의 핵심 아이디어는 매우 일반적이라고 생각합니다. .imbrication 수준의 arbritrary 번호를 코딩하는 더 우아한 방법

일반적 질문 : 무수한 수의 루프 임베딩을 코딩하는보다 세련된 방법은 무엇입니까?

구체적인 예 : 팬더 DataFrame 객체 인 및 listLevels이 hierachically 조직 기능 (의 이름 목록 인 DF와 함수 doStruf (DF, listLevels)을 예를 들면, 사람, 교실, 학교, ..., 상태들)을 나타낸다. doStruf를 들어 (DF, [ "사람", "클래스", ..., "상태"]) 내가 만들 수있는 doStruf 기능을 원하는

for person in unique(array(df["person"])): 

    personData = df[df["person"] == person] 
    for classroom in unique(array(personData["classrooms"])) : 
     classroomData = personData[personData["classroom"] == classroom] 

     ... arbritrary number of loops imbrication depending on len(listLevels) ... 


      varYData = varXData[varXData["varY"] == varY] 
      for state in unique(array(varYData["states"])) : 
       stateData = varYData[varYData["state"] == state] 

       ... do stuff using stateData ... 

같은 무엇을 처리 할 수있는 청소기 방법입니다 이런 종류의 런타임 정의 된 루프 imbrications?

+0

@Andy 헤이든이 편집되었습니다. –

+0

생각해 보면 재귀가 가장 좋은 방법 일 것 같아요. (다른 사람이 더 좋은 제안을하지 않는다면 코드를 제공 할 것입니다.)하지만 어떤 제안도 매우 감사 할 것입니다. –

+0

groupby가 작동하지 않습니까? –

답변

2

당신은 groupby 사용하여이 작업을 수행 할 수 있습니다

g = df.groupby(['person', 'classes', ..., 'varY', 'states']) 

g.apply(lambda stateData: do_stuff(stateData))