2017-05-17 3 views
0

したがって、2つのパンダデータフレームがあります。与えられた日付範囲の間のある人のためのすべての日付(df_all_days)は、その人の活動日(df_active_days)のみを持ちます。その人が3日以上連続してアクティブでない場合にのみ、df_all_daysから非アクティブな行を削除したいとします。また、この条件を満たす日付のみを削除し、他の有効期限または無効期日は削除しないでください。Pandas dataframeギャップが3日以上あると行が削除されます

たとえば以下のようになります。 df_all_daysで 'DG-3465'のすべての行を削除すると、2/2 - 2/3の非アクティブな日付は削除されませんが、2/8-2/12の間の非アクティブな日付は削除されません。 はまた、2/9-2/13 'TY-9456' の間

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 

をすべて削除私は両方のDFSをマージしようとしたし、その後のNaNた日付にバックフィル使用します。次に、すべての行に1を加えた列を追加します。日付が同じであり、その後、すべての行を削除した場合、その後の計画はローリング合計を行うことだった合計が3以上であるし、しかし、これは2つの問題、

  1. を持っていたそれは、最初の2、非アクティブ日
  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 
関連する問題