트랜잭션 데이터를 읽을 수 있도록 데이터 변환에 도움이 필요합니다.열 내 조건에 따라 그룹/클래스 만들기
나는 사건의 일부 그룹이나 클래스를 생성하기 위해 함께 그룹에 약간의 관련 거래를 시도하고
비즈니스 사례. 이 데이터 세트는 다양한 휴무 이벤트에서 퇴근하는 근로자를 나타냅니다. 나는 휴가 클래스의 365 일 이내에 떨어지는 거래를 기반으로 한 잎 클래스를 만들고 싶습니다. 추세를 차트 화하기 위해 클래스에 번호를 매겨 시퀀스/패턴을 얻고 싶습니다.
내 코드를 통해 처음 이벤트가 발생한 시점을 알 수 있으며 새 클래스가 시작될 때이를 식별 할 수 있지만 각 트랜잭션을 클래스로 버킷으로 묶지는 않습니다.
요구 사항 :
- 태그 모든 행에 따라 클래스를 떠날 것을 그들이에 속합니다.
- 각 고유 이탈 이벤트에 번호를 부여하십시오. 이 예제 색인 0을 사용하면 고유 이탈 이벤트 2, 색인 1은 고유 이탈 이벤트 2, 색인 3은 고유 이탈 이벤트 2, 색인 4는 고유 종료 이벤트 1 등이됩니다.
원하는 출력에 대한 열에 "원하는 출력"이라는 레이블이 붙어 있습니다. 1 인당 더 많은 행/이벤트가있을 수 있습니다. 그리고 더 많은 사람들이있을 수 있습니다.
일부 데이터
import pandas as pd
data = {'Employee ID': ["100", "100", "100","100","200","200","200","300"],
'Effective Date': ["2016-01-01","2015-06-05","2014-07-01","2013-01-01","2016-01-01","2015-01-01","2013-01-01","2014-01"],
'Desired Output': ["Unique Leave Event 2","Unique Leave Event 2","Unique Leave Event 2","Unique Leave Event 1","Unique Leave Event 2","Unique Leave Event 2","Unique Leave Event 1","Unique Leave Event 1"]}
df = pd.DataFrame(data, columns=['Employee ID','Effective Date','Desired Output'])
나는이 조금 투박하지만 적어도 당신의 작은 예를 들어 오른쪽 출력을 얻을 수
df['Effective Date'] = df['Effective Date'].astype('datetime64[ns]')
df['EmplidShift'] = df['Employee ID'].shift(-1)
df['Effdt-Shift'] = df['Effective Date'].shift(-1)
df['Prior Row in Same Emplid Class'] = "No"
df['Effdt Diff'] = df['Effdt-Shift'] - df['Effective Date']
df['Effdt Diff'] = (pd.to_timedelta(df['Effdt Diff'], unit='d') + pd.to_timedelta(1,unit='s')).astype('timedelta64[D]')
df['Cumul. Count'] = df.groupby('Employee ID').cumcount()
df['Groupby'] = df.groupby('Employee ID')['Cumul. Count'].transform('max')
df['First Row Appears?'] = ""
df['First Row Appears?'][df['Cumul. Count'] == df['Groupby']] = "First Row"
df['Prior Row in Same Emplid Class'][ df['Employee ID'] == df['EmplidShift']] = "Yes"
df['Prior Row in Same Emplid Class'][ df['Employee ID'] == df['EmplidShift']] = "Yes"
df['Effdt > 1 Yr?'] = ""
df['Effdt > 1 Yr?'][ ((df['Prior Row in Same Emplid Class'] == "Yes") & (df['Effdt Diff'] < -365)) ] = "Yes"
df['Unique Leave Event'] = ""
df['Unique Leave Event'][ (df['Effdt > 1 Yr?'] == "Yes") | (df['First Row Appears?'] == "First Row") ] = "Unique Leave Event"
df
그건 멋진 솔루션입니다. OP가 정말로 거대한 데이터 프레임을 사용하고있을 가능성이 있지만 그 데이터의 내용으로 판단 할 때 유일한 위험은 '병합'에 놓일 수 있습니다. – Khris