我在一个有很多内存(190GB)的工作站上运行。
我们需要groupby
数据集上有数百万条记录[通常有2个ID列,1个类型ID列,1个日期列和3-5个分类列](10-30 M之间),同时生成一个列表汇总列。
我们的问题是性能非常慢。在R
中运行相同的代码会在不到一个小时的时间内运行。
当前的测试数据集仅有7.7万条记录。数据如下所示:
ID1 ID2 typeid date_ cat1 cat2 cat3
12554876563 1435465465 09238423 2013-04-2 cat11 cat21 cat31
12554876563 1435465465 984375 2012-11-12 cat12 cat21 cat33
125543213 12554876563 01248423 2012-04-2 cat11 cat23 cat31
5436236563 125543213 09275423 2017-04-2 cat13 cat24 cat32
groupby
如下所示:
def agg_col(var):
li = ';'.join([str(i) for i in set(var.dropna())])
return li
df = ( df.groupby(['ID1','ID2']).agg(lambda x: agg_col(x))
.assign(weight=df.groupby(['ID1','ID2']).size())
我们也尝试使用dask as suggested in this post,但我们仍遇到问题,aggregate-agg
进程需要一个多小时。
任何建议将不胜感激。
答案 0 :(得分:1)
更改'类别'系列到' int'确实提高了性能,但仍然不够好
我们的解决方案是将其转储到sqlite中 - > groupby - >并重新加载。
以下数据集在不到5分钟后完成。
con = sqlite3.connect('/path/to/tempdb.db')
df.to_sql('data', con, if_exists='replace')
sql_index = 'create index id12_idx on data(ID1, ID2)'
con.execute(sql_index)
sql_gp = 'SELECT ID1, ID2, GROUP_CONCAT(DISTINCT typeid), GROUP_CONCAT(DISTINCT date_), GROUP_CONCAT(DISTINCT cat1), GROUP_CONCAT(DISTINCT cat2), GROUP_CONCAT(DISTINCT cat3) from data GROUP BY ID1, ID2')
df = pd.read_sql_query(sql_gp, con)
答案 1 :(得分:0)
你可以试试这个:
当我怀疑你可以通过agg
方法中的列表使用一个组件时,我认为你正在做两个组合。另外,我认为我们摆脱了列表理解,并将unique
与join
一起使用。
df.groupby(['ID1','ID2']).agg([lambda x: ';'.join(x.dropna().unique()),'size'])
然后您可以使用.rename(columns={'<lambda>':'agg_col','size':'weight'})