多键字典

时间:2015-12-04 01:59:27

标签: python dictionary pandas

我想在字典中找到一个项目的平均价格,该项目包含商品对,商店为关键,价格为价值

示例字典

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

例如我想找到item1的平均价格。是否可以使用多键词典或我应该更改它?有什么想法吗?

由于

4 个答案:

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

答案 1 :(得分:1)

您可以使用nested lists创建Pandas DataFrame。然后,您可以使用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

答案 2 :(得分:1)

因为这被标记为pandas ...如果你把它变成熊猫系列你可以分组到第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

答案 3 :(得分:0)

我会用pandas 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