2015-06-03 1 views
0

У меня есть файл csv, который содержит данные торговли для некоторых стран. Данные имеют формат следующим образом:Пересечения между значениями в двух словарях в python

rep par commodity value 
USA GER 1   700 
USA GER 2   100 
USA GER 3   400 
USA GER 5   100 
USA GER 80  900 
GER USA 2   300 
GER USA 4   500 
GER USA 5   700 
GER USA 97  450 
GER UK  50  300 
UK USA 4   1100 
UK USA 80  200 
UK GER 50  200 
UK GER 39  650 

Я намерен создать новый словарь и с помощью созданного словаря, рассчитать общую стоимость обыкновенных торгуемых товаров между странами. Например, рассмотрите вопрос о торговле между США-ГЭР, я намерен проверить, находится ли GER-USA в данных, и если она существует, значения для общих товаров суммируются и делают то же самое для всех стран. Словарь должен быть как:

Dic_c1c2_producs= 
{('USA','GER'): ('1','700'),('2','100'),('3','400'),('5','100'),('80','900'); 
('GER','USA'):('2','300'),('4','500'),('5','700'),('97','450') ; 
('GER','UK'):('50','300'); 
('UK','USA'): ('4','80'),('80','200'); 
('UK','GER'): ('50','200'),('39','650')} 

Как вы можете видеть, США-GER и GER-США имеют товары 2 и 5 общих и стоимость этих товаров являются (100 + 300) + (100 + 700) , Для пар USA-UK и UK-USA у нас есть общие товары: 0, поэтому общая сумма торговли будет равна 0. Для GER-UK и UK-GER товар 50 является общим, а общая торговля составляет 300 + 200. В конце концов, я хочу, чтобы иметь что-то вроде:

Dic_c1c2_summation={('USA','GER'):1200;('GER','UK'):500; ('UK','USA'):0} 

Любая помощь будет оценена.

В дополнение к моему посту, я написал следующие строки:

from collections import defaultdict 
rfile = csv.reader(open("filepath",'r')) 
rfile.next() 
dic_c1c2_products = defaultdict(set) 
dic_c_products = {} 
country = set() 
for row in rfile : 
     c1 = row[0] 
     c2 = row[1] 
     p = row[2] 
     country.add(c1) 
for i in country : 
    dic_c_products[i] = set() 
rfile = csv.reader(open("filepath")) 
rfile.next() 
for i in rfile: 
    c1 = i[0] 
    c2 = i[1] 
    p = i[2] 
    v=i[3] 
    dic_c_products[c1].add((p,v)) 
    if not dic_c1c2_products.has_key((c1,c2)) : 
     dic_c1c2_products[(c1,c2)] = set() 
     dic_c1c2_products[(c1,c2)].add((p,v)) 

    else: 
      dic_c1c2_products[(c1,c2)].add((p,v)) 
c_list = dic_c_products.keys() 
dic_c1c2_productsummation = set() 
for i in dic_c1c2_products.keys(): 
    if dic_c1c2_products.has_key((i[1],i[0])): 
     for p1, v1 in dic_c1c2_products[(i[0],i[1])]: 
      for p2, v2 in dic_c1c2_products[(i[1],i[0])]: 
       if p1==p2: 
        summation=v1+v2 
        if i not in dic_c1c2_productsum.keys(): 
         dic_c1c2_productsum[(i[0],i[1])]=(p1, summation) 
        else: 
         dic_c1c2_productsum[(i[0],i[1])].add((p1, summation)) 
    else: 
      dic_c1c2_productsn[i] = " " 
+1

вы пытались что-нибудь до сих пор? – user1269942

+0

@ user1269942 Я разместил свой код. Это не работает, хотя – homayoun

ответ

1
# save your data in a file called data 
import pandas as pd 
data = pd.read_csv('data', delim_whitespace=True) 
data['par_rep'] = data.apply(lambda x: '_'.join(sorted([x['par'], x['rep']])), axis=1) 
result = data.groupby(('par_rep', 'commodity')).filter(lambda x: len(x) >= 2).groupby(('par_rep'))['value'].sum().to_dict() 

в конце result является {'GER_UK': 500, 'GER_USA': 1200}

Смежные вопросы