다음은 제가 작업중인 거대한 데이터의 단순화 된 버전입니다. 데이터는 시간별로 정렬되어 있습니다.
df = pd.DataFrame({'group':['grp1','grp1','grp1','grp1', 'grp2','grp2','grp2','grp2','grp2'],'event':['foo','bar','foo','bar','foo','bar','bar','foo','bar'], 'time':[10,21,33,54,10,21,56,81,95]})
Qn : 각 그룹의 각 foo / bar 쌍 (bar-foo)에 대한 시간 (지연) 차이를 찾아야합니다. foo / bar가 숫자가 같고 잘 정렬되어 있기 때문에 group1이 쉽게됩니다 (각 foo 뒤에 bar가옵니다). 나는 다음과 같이 할 것이다.
final = df.pivot_table(index = 'group', columns = 'event', values = 'time', aggfunc='sum')
final['delay'] = final['bar'] - final['foo']
grp1 32
grp2 81
위의 결과는 grp1에는 좋지만 grp2의 경우 이벤트 막대가 인덱스 5 및 6에서 반복되므로 인덱스 6의 막대 값을 무시하고 결과를 얻어야합니다.
grp1 32
grp2 25
주의 사항 : 이벤트는 grp1에서와 같이 정확한 순서로 정렬되어야합니다. bar가 먼저 나타나면 해당 시간이 무시되고 다음 foo에서 시작합니다.
이것에 대한 제안에 감사하겠습니다
조건을 통해 마스킹을 시도한 다음 피벗을 수행 할 수 있습니다 (설명에 인라인 설명).
c1 = df['event'].eq("foo") #check if current row is foo
c2 = df['event'].shift(-1).eq("bar") #check if next row is bar
cond = c1&c2 #chaining c1 and c2
#if cond is True , take next row as True since bar is already below foo per cond
final = (df[cond|cond.shift()].pivot_table(index = 'group',
columns = 'event', values = 'time', aggfunc='sum').copy())
final['bar']-final['foo']
group
grp1 32
grp2 25
dtype: int64
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다