python - Python for 循环优化
问题描述
给定一个如下所示的 DataFrame:
id days cluster
0 aaa 0 0
1 bbb 0 0
2 ccc 0 1
3 ddd 0 1
4 eee 0 0
5 fff 0 1
6 ggg 1 0
7 hhh 1 1
8 iii 1 0
9 lll 1 1
10 mmm 1 1
11 aaa 1 3
12 bbb 1 3
我的目标是创建一个字典,其中包含列元素的键元组,如果两者具有相同的值,id
则列的元素列表作为值,全部按列过滤。即,如果更改但存在具有相同值的元素的元组,我想将此值添加到我已经存在的列表中。所需的输出报告如下:cluster
id
cluster
days
days
id
cluster
{('aaa', 'bbb'): [0, 3],('aaa', 'eee'): [0], ('bbb', 'eee'): [0], ('ccc', 'ddd'): [1],
('ccc', 'fff'): [1], ('ddd', 'fff'): [1], ('ggg', 'iii'): [0],
('hhh', 'lll'): [1], ('hhh', 'mmm'): [1], ('lll', 'mmm'): [1]}
我用下面的代码片段得到了这个结果,但是有数百万行它变得太慢了。如何优化代码?
y={}
for i in range(0, max(df.iloc[:,1]) + 1):
x = df.loc[df['days'] == i]
for j in range(0,l en(x)):
for z in range(1, len(x)):
if (x.iloc[z,0], x.iloc[j,0]) in y:
pass
else:
if (x.iloc[j,0], x.iloc[z,0]) not in y:
if x.iloc[j,0] != x.iloc[z,0] and x.iloc[j,2] == x.iloc[z,2]:
y[(x.iloc[j,0], x.iloc[z,0])] = [x.iloc[j,2]]
else:
if x.iloc[j,0] != x.iloc[z,0] and x.iloc[j,2] == x.iloc[z,2]:
y[(x.iloc[j,0], x.iloc[z,0])].append(x.iloc[j,2])
解决方案
考虑到瓶颈是获取 id 的组合,为什么不把它留到最后呢?
按 id 对数据进行分组,每个 id 将显示一组找到它的“bins”(日、集群):
grouped = collections.defaultdict(set)
for index, (id_, day, cluster) in df.iterrows():
grouped[id_].add((day, cluster))
对于找到的每个 bin 组合,列出属于每个 bin 的 id:
binned = collections.defaultdict(list)
for id_, bins in grouped.items():
binned[tuple(sorted(bins))].append(id_)
如果这是您需要的,请仅通过集群进行简化:
clustered = collections.defaultdict(list)
for bins, ids in binned.items():
clusters = set(cluster for (day, cluster) in bins)
clustered[tuple(sorted(clusters))].extend(ids)
最后,获取每个集群 bin 的 id 组合应该不是问题:
for bins, ids in clustered.items():
if len(ids) > 1:
for comb_id in itertools.combinations(ids, 2):
print(bins, comb_id)
# or do other stuff with it
推荐阅读
- jira - Jira 仪表板组织
- javascript - 反应
过渡后不起作用 - python - paramiko recv() 返回多个命令回显
- r - 如何将标题和图例添加到从 R 中的 PNG 图像创建的 PDF 中?
- javascript - 获取窗口宽度并作为变量发送到烧瓶
- javascript - 如何在前一个元素的悬停上触发一个元素与另一个元素的切换
- php - html 类更改为 Attributes
- coldfusion - 是否可以使用 Developer 版本模拟运行 CF 标准?
- java - @ComponentScan 和 @Bean 在上下文配置中有什么区别?
- python - 如何在计时器上刷新 Tkinter GUI 中多个变量的内容?