在Pandas Dataframe中的groupby中删除并存储最大的对象

时间:2019-01-30 06:08:20

标签: pandas dataframe

我有一个这样的数据框:

             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()遍历所有行并处理每一行。但是,我想知道是否有一些更有效的方法来执行此任务

1 个答案:

答案 0 :(得分:1)

您可以按sort_values排序,并按duplicatedboolean 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