Saya memiliki kerangka data berikut dengan ("ID", "Bulan" dan "status"). Status terkait "Churn"= 1 dan 'Not Churn" = 2.

     ID     Month   Status
     3863   201707  1
     3863   201708  1
     3863   201709  1
     3863   201710  1
     3863   201711  1
     3863   201712  1
     3863   201801  1
     3863   201802  1
     3863   201803  1
     3863   201804  1
     3863   201805  1
     3863   201806  1
     3863   201807  2
     3863   201808  2
     3863   201809  2
     3863   201810  2
     3863   201811  2
     3863   201812  2
     3863   201901  2
     3863   201902  2
     3863   201903  2
     3863   201904  2
     3863   201905  2
     3863   201906  2
     3863   201907  2
     3863   201908  1
     3863   201909  1
     3863   201910  1
     3863   201911  1
     3863   201912  1

Saya harus menghapus semua baris dengan Status = 1 (churn) untuk pelanggan yang dalam periode pengamatan memiliki Status = 2 tetapi setelah Status = 1 (pelanggan tidak aktif dan kemudian mengaktifkan kembali sendiri)

Setelah transformasi dataframe akan terlihat seperti

     ID     Month   Status
     3863   201807  2
     3863   201808  2
     3863   201809  2
     3863   201810  2
     3863   201811  2
     3863   201812  2
     3863   201901  2
     3863   201902  2
     3863   201903  2
     3863   201904  2
     3863   201905  2
     3863   201906  2
     3863   201907  2
     3863   201908  1
0
zdz 29 Januari 2020, 15:59

2 jawaban

Jawaban Terbaik

Tentukan fungsi berikut:

def fn(grp):
    if ~grp.Status.eq(2).any():
        # No rows with Status == 2 -> return nothing
        return None
    srt = grp.sort_values('Month')  # Sort rows
    # Status == 1 after Status == 2
    stat2after1 = srt.Status.shift().eq(1) & srt.Status.eq(2)
    if stat2after1.any():           # Something found
        cs = srt.Status.eq(2).cumsum()
        # Return rows from the first with Status == 2 on
        return srt[cs.gt(0)]
    return srt      # Return all rows (sorted)

Kemudian, untuk mendapatkan hasilnya, terapkan pada setiap grup:

df.groupby('ID').apply(fn).reset_index(level=0, drop=True)
0
Valdi_Bo 30 Januari 2020, 07:56

Gunakan GroupBy.transform untuk kasus 1 dan Series.where dengan GroupBy.bfill untuk kasus 2:

case1 = df['Status'].eq(1).groupby(df['ID']).transform('all')
case2 = (df['Status'].where(df['Status'].ne(1))
                     .groupby(df['ID'])
                     .bfill()
                     .eq(2)
                     .mul(df['Status'].eq(1)))
df_filtered = df.loc[~(case1|case2)]
print(df_filtered)

      ID   Month  Status
7   2311  201710       2
8   2311  201711       2
9   2311  201712       2
10  2312  201708       2
11  2312  201709       2
12  2312  201710       2
13  2312  201711       2
14  2312  201712       1
2
ansev 29 Januari 2020, 13:37