【发布时间】:2020-12-09 21:37:53
【问题描述】:
嗨,请帮助我:加快字典压缩速度;提供更好的方法或更好地理解为什么它在内部如此缓慢(例如,随着字典内存大小的增长,计算速度变慢)。我敢肯定,在不学习 C 的情况下一定有更快的方法!
classes = {i : [1 if x in df['column'].str.split("|")[i] else 0 for x in df['column']] for i in df.index}
输出:
{1:[0,1,0...0],......, 4000:[0,1,1...0]}
来自这样的 df:
data_ = {'drugbank_id': ['DB06605', 'DB06606', 'DB06607', 'DB06608', 'DB06609'],
'drug-interactions': ['DB06605|DB06695|DB01254|DB01609|DB01586|DB0212',
'DB06605|DB06695|DB01254|DB01609|DB01586|DB0212',
'DB06606|DB06607|DB06608|DB06609',
'DB06606|DB06607',
'DB06608']
}
pd.DataFrame(data = data_ , index=range(0,5) )
我在一个有 4000 行的 df 中执行它,列 df['column'] 包含一个由 | 分隔的 Id 字符串。每行中需要拆分的 ID 数量从 1 到 1000 不等,但是,这是针对所有 4000 个索引执行的。我在 df 的头上对其进行了测试,它似乎足够快,现在理解已经运行了 24 小时。所以也许这只是工作的绝对规模,但我觉得我可以加快速度,此时我想阻止它重新设计,但是,我害怕这会让我在速度没有太大提高的情况下倒退,所以在我这样做之前,我想得到一些想法、想法和建议。
超过 4000x4000 大小我怀疑使用系列和索引对象是另一个问题,我最好使用列表,但考虑到任务的大小,我不确定会获得多少速度,也许我会最好使用其他方法,例如 pd.apply(df, f(逐行写入 json))。我不确定 - 感谢任何帮助和教育,谢谢。
【问题讨论】:
-
看起来您在每次迭代时都在不必要地分割整个列。
-
您能否提供一些示例数据和您的预期输出?我很肯定你可以得到一个解决方案,让这个过程只需要几秒钟,最多可能一分钟。
-
你为什么要“预成型”“包含一串 Ids”的“df”?为什么不直接使用
set或其他更合适的数据结构?等待 24 小时表明你做错了什么! 4k 视频的像素是所有数据的一半以上,播放视频意味着每秒处理 30 次帧。你应该能够相对容易地在 100 倍内获得 Python,即正如 @ALollz 所说,几秒钟不应该是问题 -
@ALollz 谢谢我添加了一些示例数据。啊,好的,谢谢哈哈,我没有意识到,但这是有道理的,所以我需要使用 df.iloc[df.index == i].str.split() 在单元格级别进行拆分。哈哈一分钟会很甜蜜
-
@SamMason 谢谢,我想可能是缺乏经验。我会记住你的 4K 类比。 3 小时后它还在继续,所以就让它过夜,它仍然没有完成。 id 对应于与给定 id 交互的 id,它们将是唯一的,但在 df 单元中它们当前是一个字符串。你认为我应该在 df 之外这样做吗?
标签: python pandas list list-comprehension dictionary-comprehension