2013-10-06 4 views
0

시계열 데이터를 나타내는 팬더 데이터 프레임이 있습니다. DTDate (날짜 시간 날짜)라는 열과 line_code (이 열은 관찰 단위입니다. 공장에서 생산 라인이됩니다). 필자는 많은 데이터 열을 가지고 있지만이 질문을 위해서만 세 가지가 있다고 상상해보십시오.GroupBy 팬더를 사용하여 데이터 축소

근로자 - 생산 라인에있는 근로자의 수. item - 생산 라인에서 생산되는 품목의 이름입니다. 출력 - 생산 라인의 품목에 대한 출력량입니다.

일부 요일에는 하나의 항목 만 생성되며, 때로는 여러 항목을 생성합니다. 그러므로 때때로 DTDate/line_code마다 하나의 관찰이 있으며 때로는 여러 관측이 있습니다. DTDate/line_code 당 하나의 관찰로 데이터 세트를 축소해야합니다.

여기에 문지르 기가 있습니다. 우리는 어떻게 데이터를 집계하고 싶은지 아직 알지 못하며, 현재로서는 여러 집계 방법을 시도 할 수있는 구조를 구현해야합니다. 행에서 하나의 항목 만 생성하면 데이터 행을 그대로 보존하면됩니다. 라인이 주어진 DTDate에서 하나 이상의 항목을 생성 할 때 다음과 같이 관찰을 단일 관찰로 축소하려고합니다.

workers : 작업자 수가 DTDate/line_code 관측치 내에서 동일하면 단일 값 의 근로자는 붕괴 된 집합에 대한 포어를 운반한다. 작업자 수가 같지 않으면 DTDate/line_code 관측치 내의 모든 작업자 값을 포함하는 목록 개체를 만듭니다. 항목 : 항목의 목록 개체가 접힌 집합으로 전달됩니다. 출력 : 출력의 목록 개체가 접힌 집합으로 전달됩니다.

목록 항목이 축소 된 집합에 포함되어 있기 때문에 필자는 strucutre를 유연하게두고 각 열에 대해 다른 집계 방법을 실험 할 수있을만큼 충분히 유연하게두고 있습니다. 다음과 같이

는 SOFAR 나는 데이터를 그룹화 한 :

지금은 내가 뭘 걸려 라하는 것은 다음과 같은 것을 실현
import pandas as pd 
import numpy as np 
from pandas import DataFrame 
DF = DataFrame(mydata, columns = ['DTDate', 'line_code', \ 
            'workers', 'item', 'output']) 

DFGrouped = DF.groupby(['DTDate', 'line_code']) 

: myfunc1이의 경우 모든 값을 평가합니다

DFAggregated = DFGrouped.agg({'DTDate': max(), 'line_code' : max(), \ 
           'workers' : myfunc1, 'item' : myfunc2, \ 
           'output' : myfunc2}) 

지정된 열의 그룹은 동 일하며 값이있는 경우 단일 값을 리턴하고 그렇지 않으면 각 값의 목록을 리턴합니다.

myfunc2는 지정된 열 내의 그룹에있는 모든 값의 목록을 반환합니다.

제 문제는 제가 그룹 인덱스/행을 반복하는 방법에 대해 분명히 알지 못하기 때문에 그 기능을 작성하는 방법을 모르겠다는 것입니다. grouby 등에 대한 python 문서를 읽었지만 매우 유용하지 않다. 나는 내가 시도한 것에 대한 더 많은 코드를 게시해야한다는 것을 알았지 만 여기에서 벗어나기가 어렵다. 모든 포인터 크게 감사하겠습니다.

def myfunc1(ColName): 
    if len(set([DFGroup[ColName][x] for x in DFGroup.index])) == 1: 
     return DFGroup[ColName].max() 
    else: 
      return [DFGroup[ColName][x] for x in DFGroup.index] 

def myfunc2(ColName): 
    return [DFGroup[ColName][x] for x in DFGroup.index] 

당신이 볼 수있는 난을 참조하는 방법을 잘 모르겠습니다 :

이 같은 것을보고 myfunc1 및 myfunc2로부터를

Incidentall 내가 기대 (지금 설명 기능 코드를 제공하기 위해 확장) 그룹 지수 등

답변

2

각 집계 함수 (agg에 전달하는 함수)는 집계되는 열을 시리즈로 전달합니다. 따라서 myfunc2lambda x: list(x.unique())입니다. 귀하의 myfunc1은 다음과 같습니다

def collapse(x): 
    uniq = x.unique() 
    if len(uniq) == 1: 
     return uniq[0] 
    else: 
     return list(uniq) 

그러나 작업 다소 어색한 결과를 찾을 수 있습니다. 적어도, 항상 목록을 반환하는 것 (즉, myfunc1을 잊어 버리고 항상 myfunc2을 사용하는 것이 좋습니다). 값의 일부가 개별 스칼라이고 다른 값이 목록 인 열을 처리하는 것은 어색함을 알 수 있습니다.

또한 전체 데이터 프레임을 반환 할 수있는 apply을 사용하려고합니다. 이렇게하면 항목을 목록으로 접는 대신 원본 열의 고유 한 값마다 한 행을 가진 새로운 그룹화 된 테이블을 실제로 반환 할 수 있습니다.

+0

여기서 인수 x가 열의 정수인 경우 DF입니까? 고마워요. 도움이됩니다. 실제로 각 그룹 내의 인덱스를 반복 할 필요는 없습니다. 필요한 경우 어떻게합니까? 적용은 유용 할 수있는 것처럼 보이며, 그것은 마치 같은 방식으로 작동합니다. 나는 지금 볼 것이다. 고마워. –

+0

@WoodyPride : 앞에서 말했듯이 함수에 대한 인수 (필자의 예에서는'x')는 열 데이터가 포함 된 pandas 시리즈입니다. Series를 반복 할 때처럼 반복 할 수 있습니다. – BrenBarn

+0

, 감사합니다! –

관련 문제