2017-05-17 2 views
0

그래서 2 팬더 데이터 프레임이 있습니다. 하나는 지정된 날짜 범위 사이에 한 사람의 모든 날짜 (df_all_days)를가집니다. 다른 날짜는 사람의 활성 일 (df_active_days)입니다. 해당 사람이 3 일 이상 연속으로 활동하지 않는 경우에만 df_all_days에서 비활성 행을 삭제하려고합니다. 다른 활성 또는 비활성 날짜가 아닌이 조건을 충족하는 날짜 만 삭제하십시오.팬더 데이터 프레임 간격이 3 일 이상이면 행을 삭제하십시오.

예를 들면; df_all_days에서 'DG-3465'의 모든 행을 삭제하면 2/2 - 2/3의 비활성 날짜는 삭제되지 않지만 2/8-2/12 사이의 비활성 날짜는 삭제되지 않습니다. 또한, 나는 두 DFS를 병합 한 후 NaN이이었다 날짜를 백업 광고를 사용하려고 2/9-2/13

df_all_days 
PersonID  Date 
AB-123  2/1/2016 
AB-123  2/2/2016 
AB-123  2/3/2016 
AB-123  2/4/2016 
AB-123  2/5/2016 
AB-123  2/6/2016 
AB-123  2/7/2016 
AB-123  2/8/2016 
AB-123  2/9/2016 
AB-123  2/10/2016 
AB-123  2/11/2016 
AB-123  2/12/2016 
AB-123  2/13/2016 
DG-3465  2/1/2016 
DG-3465  2/2/2016 
DG-3465  2/3/2016 
DG-3465  2/4/2016 
DG-3465  2/5/2016 
DG-3465  2/6/2016 
DG-3465  2/7/2016 
DG-3465  2/8/2016 
DG-3465  2/9/2016 
DG-3465  2/10/2016 
DG-3465  2/11/2016 
DG-3465  2/12/2016 
DG-3465  2/13/2016 
TY-9456  2/1/2016 
TY-9456  2/2/2016 
TY-9456  2/3/2016 
TY-9456  2/4/2016 
TY-9456  2/5/2016 
TY-9456  2/6/2016 
TY-9456  2/7/2016 
TY-9456  2/8/2016 
TY-9456  2/9/2016 
TY-9456  2/10/2016 
TY-9456  2/11/2016 
TY-9456  2/12/2016 
TY-9456  2/13/2016 

df_active_days 
PersonID  Date 
AB-123  2/1/2016 
AB-123  2/2/2016 
AB-123  2/3/2016 
AB-123  2/7/2016 
AB-123  2/8/2016 
AB-123  2/9/2016 
AB-123  2/10/2016 
AB-123  2/11/2016 
AB-123  2/12/2016 
AB-123  2/13/2016 
DG-3465  2/1/2016 
DG-3465  2/4/2016 
DG-3465  2/5/2016 
DG-3465  2/6/2016 
DG-3465  2/7/2016 
DG-3465  2/13/2016 
TY-9456  2/1/2016 
TY-9456  2/2/2016 
TY-9456  2/3/2016 
TY-9456  2/4/2016 
TY-9456  2/5/2016 
TY-9456  2/6/2016 
TY-9456  2/7/2016 
TY-9456  2/8/2016 

'TY-9456'에 대한 모든 사이에 삭제합니다. 그런 다음 모든 행에 1이있는 열을 추가했습니다. 다음 계획은 날짜가 같은 경우 롤링 합을 다음 모든 행 합보다 큰 3입니다했다 삭제했다하지만이 처음이 비활성 일 삭제되지 않습니다

  1. 이 문제를 가지고
  2. 어떤 이유로 롤링 윈도우가 날짜에 작동하지 않습니다.
+0

시도해 본 내용을 추가 할 수 있습니까? –

+0

@ChihebNexus는 정보를 추가하여 바닥을 추가합니다. – PyRaider

+0

@Psidom 여기서 도와 줄 수 있습니까? – PyRaider

답변

0
#merge two DFs and get a indicator for inactive days 
merged = pd.merge(df_all_days,df_active_days,how='left',on=['PersonID','Date'],indicator=True) 
indicators = merged._merge.tolist() 

#check if the inactive days last for more than 2 days 
candidate=[] 
final=[] 
for k,v in enumerate(indicators): 
    if (v!='left_only'): 
     if len(candidate)<3: 
      candidate=[] 
     else: 
      final.extend(candidate) 
     candidate=[] 
    else: 
     candidate.append(k) 
if len(candidate)>2: 
    final.extend(candidate) 
#remove rows where there are more than 2 consecutive inactive days.   
df_final = merged[~merged.index.isin(final)][['PersonID','Date']] 


df_final 
Out[863]: 
    PersonID  Date 
0 AB-123 2016-02-01 
1 AB-123 2016-02-02 
2 AB-123 2016-02-03 
6 AB-123 2016-02-07 
7 AB-123 2016-02-08 
8 AB-123 2016-02-09 
9 AB-123 2016-02-10 
10 AB-123 2016-02-11 
11 AB-123 2016-02-12 
12 AB-123 2016-02-13 
13 DG-3465 2016-02-01 
14 DG-3465 2016-02-02 
15 DG-3465 2016-02-03 
16 DG-3465 2016-02-04 
17 DG-3465 2016-02-05 
18 DG-3465 2016-02-06 
19 DG-3465 2016-02-07 
25 DG-3465 2016-02-13 
26 TY-9456 2016-02-01 
27 TY-9456 2016-02-02 
28 TY-9456 2016-02-03 
29 TY-9456 2016-02-04 
30 TY-9456 2016-02-05 
31 TY-9456 2016-02-06 
32 TY-9456 2016-02-07 
33 TY-9456 2016-02-08