为什么这个字典理解这么慢?请建议加快速度的方法
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]}
您好,请帮我:加快字典压缩速度;提供更好的方法或更好地理解为什么它在内部如此缓慢(例如,随着字典内存大小的增长,计算速度变慢)。我敢肯定,一定有更快捷的方法,无需学习一些 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]}