如何提高pandas数据帧上聚合操作的速度?

时间:2017-12-01 08:01:08

标签: python pandas pandas-groupby

我有一个名为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_idtenant_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的内存。 有没有更快捷的方法来快速完成这项工作?

2 个答案:

答案 0 :(得分:2)

您可以尝试sort_values + drop_duplicates

sort_values + GroupBy.head

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