如何使用Pandas中的最新时间删除重复的entires

时间:2017-07-20 10:29:26

标签: pandas

以下是摘录:

test = pd.DataFrame({'uid':[1,1,2,2,3,3], 
                     'start_time':[datetime(2017,7,20),datetime(2017,6,20),datetime(2017,5,20),datetime(2017,4,20),datetime(2017,3,20),datetime(2017,2,20)],
                     'amount': [10,11,12,13,14,15]})

输出:

      amount start_time uid
     0  10   2017-07-20  1
     1  11   2017-06-20  1
     2  12   2017-05-20  2
     3  13   2017-04-20  2
     4  14   2017-03-20  3
     5  15   2017-02-20  3

期望的输出:

      amount start_time uid
     0  10   2017-07-20  1
     2  12   2017-05-20  2
     4  14   2017-03-20  3

我希望按uid进行分组,并注意具有最新start_time的行。基本上,我想通过仅选择具有最新start_time

我尝试test.groupby(['uid'])['start_time'].max()但它不起作用,因为它只返回uidstart_time列。我也需要amount列。

更新:感谢@jezrael& @EdChum,你们总是在这个论坛上帮助我,非常感谢你!

我在1136行和30列的数据集上测试了两个解决方案的执行时间:

Method A: test.sort_values('start_time', ascending=False).drop_duplicates('uid')
Total execution time: 3.21 ms

Method B: test.loc[test.groupby('uid')['start_time'].idxmax()]
Total execution time: 65.1 ms

我猜groupby需要更多时间来计算。

2 个答案:

答案 0 :(得分:1)

使用idxmax返回最新时间的索引并使用它来索引原始df:

In[35]:
test.loc[test.groupby('uid')['start_time'].idxmax()]

Out[35]: 
   amount start_time  uid
0      10 2017-07-20    1
2      12 2017-05-20    2
4      14 2017-03-20    3

答案 1 :(得分:0)

start_timeuid df = test.sort_values('start_time', ascending=False).drop_duplicates('uid') print (df) amount start_time uid 0 10 2017-07-20 1 2 12 2017-05-20 2 4 14 2017-03-20 3 uid使用sort_values

print (test.sort_values('start_time', ascending=False)
           .drop_duplicates('uid')
           .sort_values('uid'))

如果需要按顺序c:url输出:

JSTL