2015-12-04 2 views
1

Я хочу, чтобы найти среднюю цену товара в словаре, которые имеют пары пункта, магазин, как ключ и цена как значениеСреднего значения ключей словаря

пример словарь

{('item1', 'shop1'): 40, 
('item2', 'shop2'): 14, 
('item1', 'shop3'): 55, 

, например, Я хочу найти среднюю цену item1. Возможно ли это с помощью многоязычного словаря или я должен его изменить? Есть идеи?

Thanks

+0

Вы хотите найти среднюю цену товара во всех магазинах? –

+0

Я хочу среднее из всех предметов – mnmbs

+0

Почему это маркированные панды? –

ответ

1

Это возможно. Не уверен, что это правильная структура данных для вашей проблемы, но вы можете сделать это так.

Сначала вы выбираете все ключи пункта вы хотите, здесь я выбор 'item1':

interesting_keys = filter(lambda k: k[0] == 'item1', a.keys()) 

Теперь вы можете суммировать все эти элементы и разделить на количество элементов.

result = sum([a[k] for k in interesting_keys])/len(interesting_keys) 

Если вы хотите создать новый словарь сводится к одному элементу на ключ с последующим средним, вы можете сделать что-то, что выглядит следующим образом:

def group_prices(prices): 
    grouped_prices = {} 
    number_items = {} 
    for k, v in prices.iteritems(): 
     grouped_prices[k[0]] = grouped_prices.get(k[0], 0) + v 
     number_items[k[0]] = number_items.get(k[0], 0) + 1 
    return {k:v/number_items[k] for (k,v) in grouped_prices.iteritems()} 
+0

И если я хочу его для всех предметов? – mnmbs

+0

Что значит? Например, если вы хотите объединить информацию для каждого возможного элемента? –

+0

Да, не только для item1, но и для каждого элемента и создания новой структуры данных со средним значением для каждого элемента – mnmbs

1

Вы можете создать панда DataFrame с помощью nested lists , Затем вы можете использовать Pandas groupby, чтобы получить mean, который вы ищете.

import pandas as pd 
    df = pd.DataFrame([['item1', 'shop1', 40], 
    ['item2', 'shop2', 14], 
    ['item1', 'shop3', 55]], columns=('item', 'shop', 'price')) 
    df 
     item shop price 
    0 item1 shop1 40 
    1 item2 shop2 14 
    2 item1 shop3 55 
    result_mean = df.groupby('item')['price'].mean() 
    result_mean 
    item 
    item1 47.5 
    item2 14.0 
    Name: price, dtype: float64 
+0

Спасибо за ваш ответ. Я уже пробовал это с dataframe, но я хочу использовать его для выполнения некоторых расчетов, это довольно медленно. Моя исходная структура данных - это словарь, и я подумал, что лучше делать вычисления с помощью словаря – mnmbs

+0

@mnmbs. У вас есть тэг 'pandas' в вашем вопросе, поэтому я предоставил ответ pandas. btw: 'pandas' не медленный. –

+0

Да, но я также говорю, что я использую словарь в своем вопросе. Но это нормально. Еще раз спасибо P.S. Поверьте мне, если у вас есть файл с 2-м строками, он может быть медленным. – mnmbs

1

Поскольку помечена панд ... Если сделать это серии панд вы можете GroupBy 0-й уровень:

In [11]: d = {('item1', 'shop1'): 40, ('item2', 'shop2'): 14,('item1', 'shop3'): 55} 

In [12]: s = pd.Series(d) 

In [13]: s 
Out[13]: 
item1 shop1 40 
     shop3 55 
item2 shop2 14 
dtype: int64 

In [14]: s.groupby(level=0).mean() 
Out[14]: 
item1 47.5 
item2 14.0 
dtype: float64 
+0

Я уже пробовал его с серией и dataframes, но я подумал, что, поскольку я хочу использовать среднюю структуру данных для вычитания из моего оригинального словаря, было бы лучше, если бы это было словарь тоже. Но я могу ошибаться. Я все еще учусь :) – mnmbs

+0

Как я могу сравнить его со словарем? – mnmbs

+1

Если у вас есть 2M ряды, то и словарь, и us pandas read_csv или что-то, словарь groupby будет O (N), как только вы построили groupby pandas groupby/mean будет больше похожим на O (1). –

0

я бы решить это с помощью панд DataFrame:

# create a test dict like the question 
my_dict = dict(zip([ 
    ('item'+str(i), 'shop'+str(k)) for i in range(5) for k in range(3)], 
    [random.randint(1,10) for j in range(15) 
    ])) 

# create a DataFrame wih MultiIndex 
ndx=pd.MultiIndex.from_tuples(list(my_dict.keys()), names=['item','shop']) 
df = pd.DataFrame(list(my_dict.values()), index=ndx, columns=['price']) 
print('\n', df) 

# reset index and use groupby to get means 
df.reset_index(inplace=True) 
item_mean = df.groupby('item').mean() 
print('\n',item_mean) 

       price 
item shop   
item3 shop0  5 
     shop2  3 
item1 shop0  4 
item3 shop1  7 
item4 shop0  7 
item0 shop0  10 
item2 shop1  3 
     shop0  2 
item1 shop1  10 
item4 shop2  5 
     shop1  3 
item1 shop2  2 
item0 shop1  1 
     shop2  8 
item2 shop2  7 

      price 
item   
item0 6.333333 
item1 5.333333 
item2 4.000000 
item3 5.000000 
item4 5.000000 
Смежные вопросы