按列分组并比较日期: Pandas

3

我有以下数据框。

ID  Date1        Date2
1   7-12-2021    20-11-2021
1   10-11-2021   01-12-2021
2   22-10-2021   03-12-2021

我的想法是基于ID列的重复值,比较两个日期并保留行,如果Date2早于Date1。 如果ID的值是唯一的,则无需进行比较并保留该值。

我想要以下输出结果。

ID  Date1        Date2
1   10-11-2021   01-12-2021
2   22-10-2021   03-12-2021

我已经尝试了以下方法但没有成功。

df = df.groupby(['ID'])[(df['Date1']) < (df['Date2'])]

有人能帮我解决这个问题吗?

2个回答

2

首先,确保您的日期列是datetime类型,然后检查ID列中是否有重复项,以及Date2是否在Date1之前,如果是,则删除重复项:

# Convert to datetime
df['Date1'] = pd.to_datetime(df['Date1'])
df['Date2'] = pd.to_datetime(df['Date2'])

# Mark what you need to drop
df.loc[df.ID.duplicated(keep=False),'ind'] = 'dup'
df['ind'] = np.where((df.ind.eq('dup')) & (df['Date2'] > df['Date1']),'Drop','Keep')

>>> print(df.loc[df['ind'].eq('Keep')].drop('ind',axis=1))

  ID      Date1      Date2
1   1 2021-10-11 2021-01-12
2   2 2021-10-22 2021-03-12

2

您可以创建一个虚拟变量Keep来比较日期,为重复值创建一个mask并使用布尔索引:

df['Date1'] = pd.to_datetime(df['Date1'])
df['Date2'] = pd.to_datetime(df['Date2'])

df['Keep'] = np.where(df['Date1']>df['Date2'],True,False)
mask = df['ID'].isin(df['ID'].value_counts() > 1)
mask = (mask&df['Keep']) | (~mask&df['Keep'])
out = df[mask].drop('Keep', axis=1)

输出:

    ID  Date1   Date2
1   1   2021-10-11  2021-01-12
2   2   2021-10-22  2021-03-12

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接