2016-08-08 5 views
0

임상 데이터를 분석하고 다른 데이터 프레임의 정보를 기반으로 한 데이터 프레임의 정보를 필터링하려고합니다. dataframes 목록의팬더 : 여러 데이터 프레임의 정보를 기반으로 데이터 필터링

하나는 환자가 치료

dfTreatments = pd.DataFrame({'PatientID': [4,4,4,9,9,9,11,11,11], 'TreatmentDate': ['2016-01-01', '2016-01-15', '2016-03-25','2016-01-01','2016-01-15','2016-01-29','2016-01-01','2016-03-15','2016-03-25']}) 
dfTreatments['TreatmentDate'] = pd.to_datetime(dfTreatments['TreatmentDate']) 

    PatientID TreatmentDate 
0   4 2016-01-01 
1   4 2016-01-15 
2   4 2016-03-25 
3   9 2016-01-01 
4   9 2016-01-15 
5   9 2016-01-29 
6   11 2016-01-01 
7   11 2016-03-15 
8   11 2016-03-25 

에 대한에 와서 다른 dataframe 목록 환자가 합병증으로 병원을 방문하는 것이 날짜 것으로 거슬러 올라간다. 환자 가 이십일 치료를받지 않는 경우에 우리의 연구에서

dfHospitalVisits = pd.DataFrame({'PatientID': [4,4,9,11], 'HospitalVisitDate': ['2016-01-14','2016-03-10','2016-01-28','2016-01-03']}) 
dfHospitalVisits['HospitalVisitDate'] = pd.to_datetime(dfHospitalVisits['HospitalVisitDate']) 

    HospitalVisitDate PatientID 
0  2016-01-14   4 
1  2016-03-10   4 
2  2016-01-28   9 
3  2016-01-03   11 

, 우리는 우리의 분석에서 병원 방문을 제외 할. 은 20 일 간격 갭 전에 마지막 치료에서 제외하기 시작합니다. 예 : 2016-01-15 후에 환자 4에 대한 모든 병원 방문을 제외합니다. 이 예에서

, 환자 4의 2 차 병원을 방문환자 (11)의 병원 방문는 dfHospitalVisits에서 제거 될 것이다.

편집 : @Merlin, 지금까지 dfTreatments.groupby('PatientID')['TreatmentDate'].diff()을 사용하여 환자별로 그룹화 된 치료 날짜 간격을 확보했습니다. 내가 갇혀있는 부분은 dfHospitalVisits의 값을 필터링하기 위해 20보다 큰 치료 날짜의 차이점을 사용하는 방법을 모른다는 것입니다.

+1

당신이 시도 것을 보여주십시오. – Merlin

+0

아이디어를 찾으십시오. http://chrisalbon.com/python/pandas_join_merge_dataframe.html – Merlin

+0

제공된 링크를 살펴 봐야합니다. 코드 작성 서비스가 아닙니다. – Merlin

답변

0

나는 다음과 같은 제안 :

# Make a sorted dataframe to calculate the time gap before the next treatment 
dfTreatments_sorted = dfTreatments.sort_values(['PatientID','TreatmentDate'], ascending=False) 

# Calculate the time gap before the next treatment 
df_diff = dfTreatments_sorted.groupby('PatientID').TreatmentDate.diff(periods=1).rename('Gap_before_next_treatment') 

# Add the time gaps as a new column to your existing dfTreatments dataframe 
dfTreatments = pd.concat([dfTreatments, -df_diff], axis=1, join='inner').sort_index() 

# Join dfTreatments and dfHospitalVisits into new dataframe (df) 
df = dfHospitalVisits.set_index('PatientID').join(dfTreatments.set_index('PatientID')) 

# Select combination where TreatmentDate is before corresponding HospitalVisitDate 
df = df[(df.HospitalVisitDate>df.TreatmentDate)] 

# The TreatmentDate that is important is latest before the HospitalVisitDate 
df = df.reset_index().groupby(['PatientID','HospitalVisitDate']).max() 

# Now you can filter hospital visits given the calculated time gap 
df = df[df.Gap_before_next_treatment<'20 days'].reset_index()[['PatientID','HospitalVisitDate']] 
관련 문제