簡體   English   中英

根據多個條件過濾行

[英]Filter rows based on multiple criteria

我有以下 dataframe:

name        date_one        date_two
-----------------------------------------
sue
sue
john    
john        13-06-2019
sally       23-04-2019
sally       23-04-2019      25-04-2019
bob         18-05-2019      14-06-2019
bob         18-05-2019      17-06-2019

數據包含重復的name行。 我需要根據以下內容過濾數據(按此優先級順序):

  1. 對於每個name ,保留最新date_two的行。 如果name沒有任何具有date_two值的行,則 go 到步驟 2
  2. 對於每個name ,保留最新date_one的行。 如果name沒有任何具有date_one值的行,則 go 到步驟 3
  3. 這些names沒有任何具有date_onedate_two的行,因此只需保留該name的第一行

上面的 dataframe 將被過濾為:

name        date_one        date_two
-----------------------------------------
sue
john        13-06-2019
sally       23-04-2019      25-04-2019
bob         18-05-2019      17-06-2019

這不需要以最高效的方式完成。 dataframe只有幾千行,只需要做一次。 如果它需要在多個(慢)步驟中完成,那很好。

使用DataFrameGroupBy.idxmax每組按最大值為行,然后通過Series.isin過濾掉已經匹配的值,最后通過concat將值連接在一起:

df['date_one'] = pd.to_datetime(df['date_one'], dayfirst=True)
df['date_two'] = pd.to_datetime(df['date_two'], dayfirst=True)

#rule1
df1 = df.loc[df.groupby('name')['date_two'].idxmax().dropna()]

#rule2
df2 = df.loc[df.groupby('name')['date_one'].idxmax().dropna()]
df2 = df2[~df2['name'].isin(df1['name'])]

#rule3
df3 = df[~df['name'].isin(df1['name'].append(df2['name']))].drop_duplicates('name')

df = pd.concat([df1, df2, df3]).sort_index()
print (df)
    name   date_one   date_two
0    sue        NaT        NaT
3   john 2019-06-13        NaT
5  sally 2019-04-23 2019-04-25
7    bob 2019-05-18 2019-06-17

看起來您只是在尋找Groupby.max()

df["date_one"] = pd.to_datetime(df["date_one"],format="%d-%m-%Y")
df["date_two"] = pd.to_datetime(df["date_two"],format="%d-%m-%Y")
print (df.groupby("name").max())

#
        date_one   date_two
name
bob   2019-05-18 2019-06-17
john  2019-06-13        NaT
sally 2019-04-23 2019-04-25
sue          NaT        NaT

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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