我有一个名为data_1
的pandas数据框,如下所示:
tenant_id tenant_class_id tenant_date
100 10001 2004-01-10
100 10001 2004-08-25
101 10001 2016-09-20
102 10002 2013-07-12
103 10003 2011-04-05
103 10004 2002-05-05
103 10003 2003-12-26
我的目标是找到每个tenant_date
的最早/第一个tenant_id
。 tenant_id
采用long
格式,tenant_date
采用datetime64
格式
我使用此代码进行计算:
output = data_1.groupby(['tenant_id']).apply(lambda x: x.nsmallest(1, 'tenant_date')).reset_index(drop=1)
这适用于较小的数据集,但我的data_1
包含大约2亿行。此代码永远不会完成。我有足够的内存和大约244 GB的内存。
有没有更快捷的方法来快速完成这项工作?
答案 0 :(得分:2)
您可以尝试sort_values
+ drop_duplicates
:
output = data_1.sort_values(['tenant_id','tenant_date']).drop_duplicates(['tenant_id'])
或按idxmin
每个群体选择最低指数:
output = data_1.sort_values(['tenant_id','tenant_date']).groupby(['tenant_id']).head(1)
或者:
output = data_1.loc[data_1.groupby(['tenant_id'])['tenant_date'].idxmin()]
<强>计时强>:
output = data_1.set_index(['tenant_class_id'])
.groupby(['tenant_id'])['tenant_date'].nsmallest(1).reset_index()
警告
考虑到组的数量,结果不能解决性能问题,这会对某些解决方案的时间产生很大的影响。
答案 1 :(得分:2)
排序然后使用drop_duplicates
。但请务必先将日期列转换为日期时间。
df['tenant_date'] = pd.to_datetime(df['tenant_date'])
df.sort_values(['tenant_id', 'tenant_date']).drop_duplicates('tenant_id')
tenant_id tenant_class_id tenant_date
0 100 10001 2004-01-10
2 101 10001 2016-09-20
3 102 10002 2013-07-12
5 103 10004 2002-05-05