【发布时间】:2018-09-18 21:51:32
【问题描述】:
我在有大量内存 (190GB) 的工作站上运行。
我们需要groupby 在具有数百万条记录的数据集上[通常具有 2 个 ID 列、1 个类型 ID 列、1 个日期列和 3-5 个分类列](在 10-30 M 之间),同时生成聚合列表列。
我们的问题是性能非常慢。在R 中运行相同的代码不到一个小时。
当前的测试数据集只有 770 万条记录。数据如下所示:
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 进程需要一个多小时。
任何建议将不胜感激。
【问题讨论】:
-
你有没有分析过?我会假设理解中的
str一直在占用。 -
如果我需要生成带有
;分隔符的列表,我有哪些选择?也许在运行groupby之前对所有列上的str进行矢量化 -
你能在这个问题中添加一部分数据吗?可能是来自几个不同组的 4 或 5 行。
-
我添加了一个示例
-
也许pandas.pydata.org/pandas-docs/stable/generated/… 可以帮忙?我想知道为什么你想要这样的表示。
标签: pandas numpy pandas-groupby dask