您可以使用键作为列'new_orgs',值作为'hosts'来构造一个df,然后使用value_counts() > 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
另一种方法是 groupby 'host`,然后只计算 'new_orgs' 的数量并使用它来过滤:
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
所以差别不大,你现在的方法更快:
In [175]:
%%timeit
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)
100000 loops, best of 3: 6.85 µs per loop
但是,它不能很好地扩展到您的实际数据集大小,而上述 2 种方法可以