2013-10-08 3 views
0

나는 10 단위의 데이터를 가지고 있습니다. 매일 각 관찰 단위는 수 시간 동안 활동에 참여할 수 있습니다. 날짜 단위 - - 관찰 acitvity의 단위 - 어떤 활동 CumHours - 활동에 단위로 소요 시간의 누적 수팬더 데이터 그룹화 및 변환

날짜 : 나는 (말할 수)를 DataFrame 4 개 변수 때문에이있다.

매일 각 라인의 활동에 소비 된 시간을 나타내는 'Hours_calc'변수를 만들어야합니다. 내가 변환 방법을 필요로 믿고, 내가 (지정) 변환 함수에 전달 된 첫 번째 인수가 시리즈로 DF 열이라고 생각

DF = (mydata, columns = ['Date', 'Unit', 'Activity', 'CumHours']) 
DF['Hours_calc'] = np.nan 
DFGrouped = DF.groupby(['Unit', 'Activity']) 

: 모든 정상 비트에게 조각을 가져온 후 나는 이렇게 agg() 메소드와 마찬가지로. 그게 맞습니까?

나는 다음과 같은 함수를 썼지 만 계산을 위해 DF 또는 DFGrouped를 참조해야하는지 알지 못합니다. 일반적으로 gorup 된 데이터 내의 행/열을 참조하는 방법은 무엇입니까? 또한 groupby 그룹과 같은 길이의 시리즈를 반환하려고 시도 할 권리가 있습니까?

def WorkingHours(x, Column): 
    LISTHOURS = [] 
    for row in xrange(1, len(x)): 
     Tot = int(DFGrouped[Column][row]) - int(DFGrouped[Column][row - 1]) 
     LISTHOURS.append(Tot) 
    return pd.Series(LISTHOURS) 

TESTDF = DFGrouped.transform({Hours_calc : lambda x : WorkingHours(x, 'CumHours')}) 

또한 나는 DICT 변환을 전달하는 방법에 대한 문서에서 아무 것도보고 있지 않다, 그러나 나는 gorup에 하나 개의 변수/열 기능을 수행하는 다른 방법을 볼 수 없습니다.

어디서 잘못 되었나요? 오류 메시지가 오랫동안 혼란 스럽지만 "데이터 형식에 대해 유효하지 않은 변환 함수"로 끝납니다.

+0

문제를 올바르게 이해하고 있는지는 잘 모르겠지만 Unit, Activity 대신 Date, Unit별로 그룹화하면 안됩니까? 이렇게하면 각 그룹에 대한 CumHours의 합계를 사용하여 모든 활동에 소요되는 총 시간을 구할 수 있습니다. – yemu

+0

나는 그렇게 생각하지 않는다. 나는 하루 종일 어떤 활동 에든지 소비해야한다. 예를 들어, unit1이 두 개의 활동을하는 기간을 상상해보십시오. CumHours는 해당 날짜에 수행 한 활동에 대해 해당 단원이 소비 한 누적 시간을 측정합니다. 일일 시간 측정을 찾으려면 주어진 날짜에 누적 시간을 가져와 해당 활동이 수행 된 마지막 날로부터 누적 시간을 뺍니다. 따라서 단위/활동 및 날짜 별 정렬을 기준으로 그룹화하면 –

+3

에 몇 가지 데이터가 채워진 데이터 파일의 예를 제공 할 수 있습니까? – yemu

답변

2

한 행만큼 그룹화 된 데이터의 열을 이동하려면 시프트 기능을 사용할 수 있다고 생각합니다. 그런 다음 원본을 뺀 다음 이동하면 활동에 소요 된 원시 시간이 표시됩니다. 1. 당신은 일반적으로 기능하지만, 목록에 복사하지 않고 변환을 사용 시리즈 요소를 반복하려면

df = (mydata, columns = ['date', 'unit', 'activity', 'cumhours']) 
grouped = df.groupby(['unit', 'activity']) 
shift_it = lambda x: (x - x.shift()) 
raw_hours = grouped.cumhours.transform(shift_it) 
df.insert(0, 'raw_hours',raw_hours) 

편집이 시도 :

df = (mydata, columns = ['date', 'unit', 'activity', 'cumhours']) 
grouped = df.groupby(['unit', 'activity']) 
def trans_func(x): 
    y=x.copy() 
    for i in range(1,len(x.index)): 
     x.iloc[i]=y.iloc[i]-y.iloc[i-1] 
    return x 

raw_hours = gr['cumhours'].transform(lambda x: trans_func(x)) 
df.insert(0, 'raw_hours',raw_hours) 
+0

고맙다. 나는 이것을 시험 할 것이다. 그룹화 된 데이터에 포함 된 행을 참조하고 기본 데이터를 변경하는 방법을 궁금해합니다.이 솔루션은 기본적으로 작동 할 수 있다고 생각하지만, 모든 행의 데이터에 동일한 작업을 수행하는 것을 기반으로합니다. 반면에 각 행을 반복하고 함수에 따라 변경하는 함수를 작성할 수 있어야한다고 생각합니다. 어떤 아이디어? –

+0

iloc 함수를 사용할 수있는 행을 반복 할 수 있습니다. 위의 내용을 참조하십시오. – yemu

1

내가 마지막으로 문제를 해결했다 생각합니다. 나는 yemu의 대답은 좋은 것으로 생각하지만 결국 내 자신의 기능을 적용하는 방법을 배우는 운동이었다 나는이 선호 :

DF = (mydata, columns = ['Date', 'Unit', 'Activity', 'CumHours']) 
DF['Hours_calc'] = np.nan 
DFGrouped = DF.groupby(['Unit', 'Activity']) 

def WorkingHours(x): 
    CumHoursList = list(x) 
    HoursCalcList = [] 
    HoursCalcList.insert(0, CumHoursList[0]) 
    for index in xrange(1, len(CumHoursList)): 
     CalcHoursList/insert(index, CumHoursList[index] - CumHoursList[index - 1]) 
    return CalcHoursList 

DFGrouped['CumHours'].transform(lambda x: WorkingHours(x)) 

이 매력을 작품!

+0

여전히 목록으로 변환하지 않고 x로 전달되는 Series를 반복하는 방법이 있어야한다고 생각합니다. 하지만이 솔루션은 지금 당장 나를 위해 일합니다. –

+0

목록을 사용하지 않는보다 일반적인 해결책을 포함하도록 내 대답을 편집했습니다. – yemu

+0

그 해결책이 있습니다. 감사합니다 –

관련 문제