我有一个这样的数据框:
userid watched timestamp
15 553938 M1 1499371200000
15390 527638 M2 1599731200000
15389 521638 M2 1399901200000
15388 521638 M3 1439841200000
15387 553938 M4 1499521200000
对于每个用户,我需要在timestamp
列下找到“最新”,删除相应的行,并将该行存储在新的数据框中。
一种方法是使用DataFrame.iterrows()遍历所有行并处理每一行。但是,我想知道是否有一些更有效的方法来执行此任务
答案 0 :(得分:1)
您可以按sort_values
排序,并按duplicated
和boolean indexing
创建的布尔掩码进行过滤:
df = df.sort_values('timestamp', ascending=False)
mask = df.duplicated('userid')
df1 = df[mask]
df2 = df[~mask]
print (df1)
userid watched timestamp
15 553938 M1 1499371200000
15389 521638 M2 1399901200000
print (df2)
userid watched timestamp
15390 527638 M2 1599731200000
15387 553938 M4 1499521200000
15388 521638 M3 1439841200000
或者通过DataFrameGroupBy.idxmax
获取索引并通过loc
选择索引,要删除索引,请使用drop
:
idx = df.groupby('userid')['timestamp'].idxmax()
df1 = df.drop(idx)
#alternative
#df1 = df.loc[~df.index.isin(idx)]
df2 = df.loc[idx]
print (df1)
userid watched timestamp
15 553938 M1 1499371200000
15389 521638 M2 1399901200000
print (df2)
userid watched timestamp
15388 521638 M3 1439841200000
15390 527638 M2 1599731200000
15387 553938 M4 149952120000