保留最新值并删除旧行(pandas)

时间:2017-01-10 08:38:51

标签: python datetime pandas dataframe

下面有一个数据框表,其中包含新旧值。我想在保留新值的同时删除所有旧值。

ID    Name     Time    Comment
0     Foo   12:17:37   Rand
1     Foo   12:17:37   Rand1
2     Foo   08:20:00   Rand2
3     Foo   08:20:00   Rand3
4     Bar   09:01:00   Rand4
5     Bar   09:01:00   Rand5
6     Bar   08:50:50   Rand6
7     Bar   08:50:00   Rand7

因此它应该如下所示:

ID    Name     Time    Comment
0     Foo   12:17:37   Rand
1     Foo   12:17:37   Rand1
4     Bar   09:01:00   Rand4
5     Bar   09:01:00   Rand5

我尝试使用下面的代码,但这会删除1个新值和1个旧值。

df[~df[['Time', 'Comment']].duplicated(keep='first')]

任何人都可以提供正确的解决方案吗?

2 个答案:

答案 0 :(得分:3)

我认为您可以将此解决方案与to_timedelta一起使用,如果需要按列Time的最大值进行过滤:

df.Time = pd.to_timedelta(df.Time)
df = df[df.Time == df.Time.max()]
print (df)
   ID Name     Time Comment
0   0  Foo 12:17:37    Rand
1   1  Foo 12:17:37   Rand1

EDITed解决方案类似,只添加了groupby

df = df.groupby('Name', sort=False)
       .apply(lambda x: x[x.Time == x.Time.max()])
       .reset_index(drop=True)
print (df)
   ID Name     Time Comment
0   0  Foo 12:17:37    Rand
1   1  Foo 12:17:37   Rand1
2   4  Bar 09:01:00   Rand4
3   5  Bar 09:01:00   Rand5

答案 1 :(得分:2)

您可以将群组的最大值合并回原始DF:

df['Time'] = pd.to_timedelta(df['Time'])

In [35]: pd.merge(df, df.groupby('Name', as_index=False)['Time'].max(), on=['Name','Time'])
Out[35]:
   ID Name     Time Comment
0   0  Foo 12:17:37    Rand
1   1  Foo 12:17:37   Rand1
2   4  Bar 09:01:00   Rand4
3   5  Bar 09:01:00   Rand5

说明:

In [36]: df.groupby('Name', as_index=False)['Time'].max()
Out[36]:
  Name     Time
0  Bar 09:01:00
1  Foo 12:17:37