2 回答

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊
這樣的事情怎么樣?另外,好像有錯(cuò)別字。最后一行是 Bat,這應(yīng)該是 BALL 嗎?(根據(jù)您的預(yù)期輸出)
lst = ['CAT', 'BALL']
檢查事件中是否存在列表的選定元素。存在則賦1,不存在則賦0。
df['C'] = np.where(df['Event'].isin(lst), 1, 0)
在此之后,我們可以對(duì) C 列執(zhí)行 cumsum 并過濾行。這可以通過在 Name 上使用 groupby 并在 c 列上執(zhí)行 cumsum 并檢查是否存在大于 0 的 cumsum 來完成。只有當(dāng)該 groupby (Name) 的事件中存在列表的那些元素時(shí),才會(huì)發(fā)生大于 0 的情況
df = df.loc[df.groupby('Name')['C'].cumsum()>0].reset_index(drop=True)
df.drop('C', 1, inplace=True)
print (df)
Name Date Event Col1
0 Sam 1/3/2020 BALL Test1
1 Sam 1/3/2020 CAT Test2
2 Sam 1/5/2020 BALL Test2
3 Sam 1/6/2020 Apple Test3
4 Nick 1/5/2020 CAT Test3
5 Nick 1/6/2020 BALL Test3
6 Nick 1/7/2020 Apple Test3
7 Nick 1/8/2020 Apple Test4

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超6個(gè)贊
這有點(diǎn)難以理解(您是否將事件過濾器從 Bat 切換為 BALL?:D),而且您似乎正在嘗試讓每個(gè)人獲得第一個(gè)事件?
如果是這樣,我認(rèn)為您需要按名稱拆分?jǐn)?shù)據(jù)框,根據(jù)需要進(jìn)行過濾,然后重新組合。
這是第一次出現(xiàn)的小函數(shù):
def get_min_index(ser, event_filter):
in_event = ser.isin(event_filter)
return in_event.loc[in_event].index[0]
然后假設(shè)您的 df 已經(jīng)按照您的需要進(jìn)行了排序。
tdf_lst = []
names = df['Name'].unique()
for name in names:
tdf = df.loc[df['Name']==name, :] # filter for the individual name
min_idx = get_min_index(tdf['Event'], event_filter) # get the first index
tdf = tdf.loc[min_idx:,:] # select from the first index to the last
tdf_lst.append(tdf)
df_fltrd = pd.concat(tdf_lst)
也許有一個(gè)更優(yōu)雅的解決方案,但希望這就是您正在尋找的
添加回答
舉報(bào)