[英]DataFrame filter based on groupby
這是我的簡化示例df:
salesPerson customer measure timeStamp
--------------------------------------
A 123 I 12:30
A 123 II 12:30
A 123 III 12:30
B 123 IV 12:35
C 456 I 14:30
C 456 II 14:30
D 456 III 14:15
我要執行的操作是歸檔數據幀,並在2個不同的salesPerson ID具有相同客戶編號的情況下,請保留timeStamp最早的salesPerson的所有行。 在此示例中,結果df為:
salesPerson customer measure timeStamp
--------------------------------------
A 123 I 12:30
A 123 II 12:30
A 123 III 12:30
D 456 III 14:15
最好/最有效的方法是什么? 我考慮過使用熊貓groupby.filter或groupby.transform,但是坦率地說,不知道如何准確地編寫它們。
獎勵點是將刪除的行放在單獨的Deleted_df對象中。
這種單線應該可以解決問題:
df[df['salesPerson'].isin(df.iloc[df.groupby(['customer'])['timeStamp'].idxmin(), 'salesPerson'])]
說明:
為了確定我們要過濾的銷售人員,首先按customer
對df
進行分組,並使用idxmin
timeStamp
找到最小timeStamp
的索引:
df.groupby(['customer'])['timeStamp'].idxmin()
然后,將這些索引值以及iloc
,以從用於過濾的salesPerson
獲取值:
df.iloc[df.groupby(['customer'])['timeStamp'].idxmin(), 'salesPerson']
最后,將該結果傳遞給Series方法isin
,並使用該結果索引到df
。 結果是:
0 A 123 I 2017-07-12 12:30:00
1 A 123 II 2017-07-12 12:30:00
2 A 123 III 2017-07-12 12:30:00
6 D 456 III 2017-07-12 14:15:00
要創建帶有已過濾出行的第二個DataFrame,可以將索引從已過濾df傳遞到原始df,並排除這些行。 因此,如果我們將上述結果分配給df1
,則可以按以下方式創建互補的df2
:
df2 = df[~df.index.isin(df1.index)]
結果:
3 B 123 IV 2017-07-12 12:35:00
4 C 456 I 2017-07-12 14:30:00
5 C 456 II 2017-07-12 14:30:00
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.