pandas groupby performance

时间:2018-04-09 13:16:18

标签: pandas numpy pandas-groupby dask

我在一个有很多内存(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进程需要一个多小时。

任何建议将不胜感激。

2 个答案:

答案 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方法中的列表使用一个组件时,我认为你正在做两个组合。另外,我认为我们摆脱了列表理解,并将uniquejoin一起使用。

df.groupby(['ID1','ID2']).agg([lambda x: ';'.join(x.dropna().unique()),'size'])

然后您可以使用.rename(columns={'<lambda>':'agg_col','size':'weight'})

重命名列