给定如下所示的数据帧:
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
列元素的keys元组,以及cluster
列元素的值列表(如果两个id
具有相同的cluster
值,所有这些值都由days
列过滤)。i、 例如,如果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将显示一组“存储箱”(日、群集),在这些存储箱中可以找到数据:
对于找到的每个bin组合,列出属于每个bin的id:
如果您需要,请仅通过群集进行简化:
最后,获取每个集群箱的ID组合应该不是问题:
您可以利用
pandas.DataFrame.groupby
方法:这将为您提供所需的结果:
相关问题 更多 >
编程相关推荐