我有以下数据框:
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
行。我需要根据以下内容(按优先级顺序)过滤数据:
name
,请在行中保留最新的date_two
。如果name
没有任何行具有date_two
的值,请转到步骤2 name
,请在行中保留最新的date_one
。如果name
没有任何行具有date_one
的值,请转到步骤3 names
没有包含date_one
或date_two
的行,因此只需保留该name
的第一行上述数据框将被过滤为:
name date_one date_two
-----------------------------------------
sue
john 13-06-2019
sally 23-04-2019 25-04-2019
bob 18-05-2019 17-06-2019
这不需要以最高效的方式完成。数据帧只有几千行,只需要执行一次。如果需要分多个步骤进行,则可以。
答案 0 :(得分:1)
每组对每个行使用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