【发布时间】:2021-09-26 10:40:28
【问题描述】:
这是我的第一篇文章,所以请多多包涵。我需要一些帮助来优化下面的一个班轮。
pd_df.loc[flag, 'COL_{}'.format(col_number)] = pd_df.loc[flag,'COL{}'.format(col_number)].apply(lambda x: x + str(userid) + "@")
pd_df : Panda 数据框包含 2M 行
flag= numpy 一维布尔数组在 pd_df 中一次过滤/更新多行
COL_{}'.format(col_number)= 根据主 FOR 循环的随机列号,如 COL_1、COL_5 到 COL_15(数据类型字符串,长度为 5000 个字符)
一般来说,这段代码是做什么的,首先根据列号过滤要更新的标志和列,并在这些多行和单列中附加用户ID列表,并以@作为分隔符。例如@userid1@userid2@userid2 等等。
这行代码占用了我总时间的 75%,原因是 pandas 数据帧 loc 函数缓慢且行数很大,即 2M。
谁能帮我把这块转换成更优化的方式,比如字典/numpy数据类型。
下面是上面代码正在创建的输出。基于 Country 和 Category 用户 ID 相关,其用户 ID 附加到该列号。假设 Col_1 最多可以包含 userid3,column2 最多可以包含 userid7,依此类推,直到 col15。
提前致谢。
问候, 丽娃
【问题讨论】:
-
如果您展示更多代码,可能会有其他优化帮助更多。
-
其他部分已经优化,只是一个循环,通过用户ID列表检查它将在哪些行和列中附加分隔符
-
您可以编辑您的问题并将示例输入放在那里以便我们复制吗?
-
样本输入?我不明白。你想要一些 excel 格式的样本输入数据吗?我共享的代码是大代码的一小部分,并且该代码的输入全部在内存中,而不是来自本地文件。加载初始文件后,我们会根据逻辑进行大量计算。所以输入数据可能没有用。我只是想知道一些更好的方法来替换这个占用我所有执行时间的线性代码。
-
对不起,如果我一开始不够清楚。
标签: python python-3.x pandas numpy dictionary