我有一个字典'orgs_dict',我想将每个值与所有值进行比较,因为我将所有值放在一个集合中然后进行比较,如果它们是相同的我添加它到'final_hosts'字典:
orgs_dict = {'Ridgway School': 'ridgway','Ridgway Uni': 'ridgway', 'Aktieselskapet': 'aktieselskapet','Aktieselskapet_1': 'aktieselskapet', 'Chinese Education Association Ex': 'chinese association ex', 'Gestora de Infraestructuras de Telecomunicaciones': 'gestora infraestructuras telecomunicaciones','Aktieselskapet_5': 'aktieselskapet'}
这是我的代码:
set_neworgs=set()
for key in orgs_dict.keys():
set_neworgs.add(orgs_dict[key])
final_hosts = defaultdict(list)
for i in set_neworgs:
for k,v in orgs_dict.items():
if i == v:
final_hosts[i].append(k)
这很好但是当我的'orgs_dict'非常庞大时,它需要3个小时才能完成。我想知道任何一个人都知道更可选的方法吗?
答案 0 :(得分:1)
您可以使用键作为列'new_orgs'来构建df,将值作为'hosts'构建,然后使用value_counts() > 1
作为布尔过滤器,然后使用{{过滤本系列中存在的主机1}}:
isin
另一种方法是In [150]:
orgs_dict = {'Ridgway School': 'ridgway','Ridgway Uni': 'ridgway', 'Aktieselskapet': 'aktieselskapet','Aktieselskapet_1': 'aktieselskapet', 'Chinese Education Association Ex': 'chinese association ex', 'Gestora de Infraestructuras de Telecomunicaciones': 'gestora infraestructuras telecomunicaciones','Aktieselskapet_5': 'aktieselskapet'}
df =pd.DataFrame({'new_orgs':list(orgs_dict.keys()), 'hosts':list(orgs_dict.values())})
df
Out[150]:
hosts \
0 aktieselskapet
1 ridgway
2 aktieselskapet
3 ridgway
4 chinese association ex
5 gestora infraestructuras telecomunicaciones
6 aktieselskapet
new_orgs
0 Aktieselskapet_1
1 Ridgway School
2 Aktieselskapet_5
3 Ridgway Uni
4 Chinese Education Association Ex
5 Gestora de Infraestructuras de Telecomunicaciones
6 Aktieselskapet
In [157]:
df[df['hosts'].isin((df['hosts'].value_counts()[df['hosts'].value_counts()> 1].index))]
Out[157]:
hosts new_orgs
0 aktieselskapet Aktieselskapet_1
1 ridgway Ridgway School
2 aktieselskapet Aktieselskapet_5
3 ridgway Ridgway Uni
6 aktieselskapet Aktieselskapet
'host`然后只计算'new_orgs'的数量并使用它来过滤:
groupby
<强>定时强>
在这个小样本集上我得到了
In [167]:
df['host_count'] = df.groupby('hosts')['new_orgs'].transform('count')
df[df['host_count'] > 1]
Out[167]:
hosts new_orgs host_count
0 aktieselskapet Aktieselskapet_1 3
1 ridgway Ridgway School 2
2 aktieselskapet Aktieselskapet_5 3
3 ridgway Ridgway Uni 2
6 aktieselskapet Aktieselskapet 3
所以差别不大,你现在的方法更快:
In [168]:
%%timeit
df['host_count'] = df.groupby('hosts')['new_orgs'].transform('count')
df[df['host_count'] > 1]
1000 loops, best of 3: 1.65 ms per loop
In [169]:
%timeit df[df['hosts'].isin((df['hosts'].value_counts()[df['hosts'].value_counts()> 1].index))]
1000 loops, best of 3: 1.49 ms per loop
但是,它不能很好地扩展到您的实际数据集大小,而上述两种方法将
答案 1 :(得分:1)
Python 2.7 + :使用此词典理解可以找到值相同的键:
{k: orgs_dict[k] for k in orgs_dict if orgs_dict.values().count(orgs_dict[k])>1}
Python 3.x :将orgs_dict.values()
打包到list
的调用中:
{k: orgs_dict[k] for k in orgs_dict if list(orgs_dict.values()).count(orgs_dict[k])>1}
输出:
{'Aktieselskapet_1': 'aktieselskapet', 'Ridgway School': 'ridgway', 'Aktieselskapet': 'aktieselskapet', 'Ridgway Uni': 'ridgway', 'Aktieselskapet_5': 'aktieselskapet'}
另一种方法:
在2.7+和3.x中使用Counter
模块中的collections
:
from collections import Counter
c = Counter(orgs_dict.values()) # count values
{k : orgs_dict[k] for k in orgs_dict.keys() if c[orgs_dict[k]]>1}