首页 > 解决方案 > 在 Pandas Dataframe 中的 groupby 中删除和存储最大的

问题描述

我有一个这样的数据框:

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

标签: pandasdataframe

解决方案


sort_values您可以按and 创建的布尔掩码进行排序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

推荐阅读