最終,我試圖找出一個人何時同時執行兩項操作。假設我們有一個 df:
df = DataFrame({
'User': ['Carl', 'Carl', 'Steve', 'Carl', 'Steve', 'Steve'],
'Action': ['Jump', 'Run', 'Jump', 'Swim', 'Run', 'Run'],
'Time': [12:01:01, 12:01:01, 12:04:03, 12:10:01, 12:17:31, 12:17:31 ]})
這給了我一個看起來像這樣的 df:
User Action Time
Carl Jump 12:01:01
Carl Run 12:01:01
Steve Jump 12:04:03
Carl Swim 12:10:01
Steve Run 12:17:31
Steve Run 12:17:31
我想找到用戶和時間與另一行相同但操作不同的情況。所以在 about 的情況下,我想回傳:
User Action Time
Carl Jump 12:01:01
Carl Run 12:01:01
我嘗試復制 df 并執行以下操作:
df['dupe'] = np.where((df.user == df2.user) & (df.action!= df2.action) & (df.time == df2.time)) , 1, 0)
df = df[df.dupe == 1]
但似乎是在 DF 中的任何行中尋找匹配項,而我正在尋找同一行中的兩個匹配項和一個不匹配項。
我已經搜索了一個多小時以前的問題,所以我想我會繼續問。任何建議都會很棒。
uj5u.com熱心網友回復:
所以我們可以做merge然后dropna過濾差異
out = df.merge(df2,on = ['User','Time'],how='left').query('Action_x!=Action_y').dropna()
User Action_x Time Action_y
1 Carl Jump 12:01:01 Run
2 Carl Run 12:01:01 Jump
uj5u.com熱心網友回復:
您還可以按Name和Time過濾具有多行且沒有重復的組:
subset = df.groupby(['User', 'Time']).filter(lambda g: len(g) > 1 and not g['Action'].duplicated(keep=False).any())
輸出:
>>> subset
User Action Time
0 Carl Jump 12:01:01
1 Carl Run 12:01:01
uj5u.com熱心網友回復:
首先根據“用戶”和“時間”保留重復的行,然后根據“用戶”、“操作”、“時間”洗掉重復的行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/383792.html
