令我惊讶的是,只有~2e6行的数据集相当慢.但是我不需要获得所有最大值,只需要最后一个.
import numpy as npimport pandas as pddf = pd.DataFrame({ "ID": np.random.randint(1,1000,size=5000),"status": np.random.randint(1,10,"date": [ time.strftime("%Y-%m-%d",time.localtime(time.time() - x)) for x in np.random.randint(-5e7,5e7,size=5000) ],})%timeit df.groupby('ID').apply(lambda t: t[t.date==t.date.max()])1 loops,best of 3: 576 ms per loop%timeit df.reindex(df.sort_values(["date"],ascending=False)["ID"].drop_duplicates().index)100 loops,best of 3: 4.82 ms per loop
第一个是我在链接中找到的解决方案,这似乎是一种允许更复杂 *** 作的方法.
但是对于我的问题,我可以排序和删除重复项和重新索引,这会更好地执行.特别是在较大的数据集上,这确实有所不同.
我的问题:有没有其他方法可以实现我想做的事情?可能会有更好的表现?
解决方法 解决此问题的另一种方法是在groupby上使用聚合,然后在完整数据帧上进行选择.df.iloc[df.groupby('ID')['date'].IDxmax()]
这似乎比您提出的解决方案快5-10倍(见下文).请注意,这仅在’date’列是数字而不是字符串类型时才有效,并且此转换还可以加快基于排序的解决方案:
# Timing your original solutions:%timeit df.groupby('ID').apply(lambda t: t[t.date==t.date.max()])# 1 loops,best of 3: 826 ms per loop%timeit df.reindex(df.sort_values(["date"],ascending=False)["ID"].drop_duplicates().index)# 100 loops,best of 3: 5.1 ms per loop# convert the datedf['date'] = pd.to_datetime(df['date'])# new times on your solutions%timeit df.groupby('ID').apply(lambda t: t[t.date==t.date.max()])# 1 loops,best of 3: 815 ms per loop%timeit df.reindex(df.sort_values(["date"],ascending=False)["ID"].drop_duplicates().index)# 1000 loops,best of 3: 1.99 ms per loop# my aggregation solution%timeit df.iloc[df.groupby('ID')['date'].IDxmax()]# 10 loops,best of 3: 135 ms per loop总结
以上是内存溢出为你收集整理的python – 从Pandas数据框中获取最后一个条目的最佳方法全部内容,希望文章能够帮你解决python – 从Pandas数据框中获取最后一个条目的最佳方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)