我有一个熊猫数据框,如下所示:
我想获取每个唯一的ID,即具有最大日期的行,以便最终结果看起来像这样:
我的日期列的数据类型为“对象”。我尝试过分组,然后尝试按以下方式获取最大值:
idx = df.groupby(['ID','Item'])['date'].transform(max) == df_Trans['date']
df_new = df[idx]
但是我无法获得期望的结果。在这个问题上的任何帮助将不胜感激!
答案 0 :(得分:3)
idxmax
只要index
是唯一的或不重复最大索引,就应该起作用。
df.loc[df.groupby('ID').date.idxmax()]
只要最大值是唯一的就应该起作用。否则,您将获得等于最大行数的所有行。
df[df.groupby('ID')['date'].transform('max') == df['date']]
也是很好的解决方案。
df.sort_values(['ID', 'date']).drop_duplicates('date', keep='last')
答案 1 :(得分:0)
我的回答是对@piRSquared 的概括
manykey
表示需要映射的键(多对)
onekey
表示需要映射到的键(一对一)
sortkey
是可排序的键,它遵循 asc
设置为 True(作为 python 标准)
def get_last(df:pd.DataFrame,manykey:list[str],onekey:list[str],sortkey,asc=True):
return df.sort_values(sortkey,asc).drop_duplicates(subset=manykey, keep='last')[manykey+onekey]
在你的情况下,答案应该是
get_last(df,["id"],["item"],"date")
请注意,我明确使用 onekey
是因为我想删除其余的键(如果它们在表中)并创建一个映射。
PS 如果这应该是评论而不是答案,请告诉我。 SO 新手