簡體   English   中英

基於groupby的DataFrame過濾器

[英]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'])]

說明:

為了確定我們要過濾的銷售人員,首先按customerdf進行分組,並使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM