Python Pandas:如何最佳地将字典的每个值与所有其他值进行比较?

时间:2015-04-21 12:53:41

标签: python dictionary pandas comparison

我有一个字典'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个小时才能完成。我想知道任何一个人都知道更可选的方法吗?

2 个答案:

答案 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}