2 回答

TA貢獻1982條經驗 獲得超2個贊
這樣的事情怎么樣?另外,好像有錯別字。最后一行是 Bat,這應該是 BALL 嗎?(根據您的預期輸出)
lst = ['CAT', 'BALL']
檢查事件中是否存在列表的選定元素。存在則賦1,不存在則賦0。
df['C'] = np.where(df['Event'].isin(lst), 1, 0)
在此之后,我們可以對 C 列執行 cumsum 并過濾行。這可以通過在 Name 上使用 groupby 并在 c 列上執行 cumsum 并檢查是否存在大于 0 的 cumsum 來完成。只有當該 groupby (Name) 的事件中存在列表的那些元素時,才會發生大于 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貢獻1848條經驗 獲得超6個贊
這有點難以理解(您是否將事件過濾器從 Bat 切換為 BALL?:D),而且您似乎正在嘗試讓每個人獲得第一個事件?
如果是這樣,我認為您需要按名稱拆分數據框,根據需要進行過濾,然后重新組合。
這是第一次出現的小函數:
def get_min_index(ser, event_filter):
in_event = ser.isin(event_filter)
return in_event.loc[in_event].index[0]
然后假設您的 df 已經按照您的需要進行了排序。
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)
也許有一個更優雅的解決方案,但希望這就是您正在尋找的
添加回答
舉報