为什么这个字典理解这么慢?请建议加快速度的方法

Why is this dictionary comprehension so slow? Please suggest way to speed it up

您好,请帮我:加快字典压缩速度;提供更好的方法或更好地理解为什么它在内部如此缓慢(例如,随着字典内存大小的增长,计算速度变慢)。我敢肯定,一定有更快捷的方法,无需学习一些 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的head上测试了一下,好像够快的,现在理解已经运行了24hrs了。所以也许这只是工作的庞大规模,但我觉得我可以加快它的速度,此时我想停止它重新设计,但是,我担心这会让我在速度没有太大提高的情况下退缩,所以在我这样做之前想得到一些想法、想法和建议。

超过 4000x4000 大小我怀疑使用系列和索引对象是另一个问题,我最好使用列表,但考虑到任务的大小,我不确定速度会提高多少,也许我最好使用其他一些方法,例如 pd.apply(df, f(write line by line to json))。我不确定 - 感谢任何帮助和教育,谢谢。

这是一种方法:

import pandas as pd

# create data frame
df = pd.DataFrame({'idx': [1, 2, 3, 4], 'col': ['1|2', '1|2|3', '2|3', '1|4']})

# split on '|' to convert string to list
df['col'] = df['col'].str.split('|')

# explode to get one row for each list element
df = df.explode('col')

# create dummy ID (this will become True in the final result)
df['dummy'] = 1

# use pivot to create dense matrix
df = (df.pivot(index='idx', columns='col', values='dummy')
        .fillna(0)
        .astype(int))

# convert each row to a list
df['test'] = df.apply(lambda x: x.to_list(), axis=1)
print(df)

col  1  2  3  4          test
idx                          
1    1  1  0  0  [1, 1, 0, 0]
2    1  1  1  0  [1, 1, 1, 0]
3    0  1  1  0  [0, 1, 1, 0]
4    1  0  0  1  [1, 0, 0, 1]

你想要的输出可以使用dummies来实现。我们拆分列 stack,并使用 max 将其变成基于原始索引的虚拟指标。然后我们使用reindex根据'drugbank_id'列按照你想要的顺序得到它。

最后为了得到你想要的字典我们将转置并使用to_dict

classes = (pd.get_dummies(df['drug-interactions'].str.split('|', expand=True).stack())
             .max(level=0)
             .reindex(df['drugbank_id'], axis=1)
             .fillna(0, downcast='infer')
             .T.to_dict('list'))

print(classes)
{0: [1, 0, 0, 0, 0],  #Has DB06605, No DB06606, No DB06607, No DB06608, No DB06609
 1: [1, 0, 0, 0, 0],
 2: [0, 1, 1, 1, 1],
 3: [0, 1, 1, 0, 0],
 4: [0, 0, 0, 1, 0]}