Python 多键字典的平均值

Python 多键字典的平均值,python,dictionary,pandas,Python,Dictionary,Pandas,我想在一本字典中找到一件物品的平均价格,它有成对的物品,商店是关键,价格是价值 示例词典 {('item1', 'shop1'): 40, ('item2', 'shop2'): 14, ('item1', 'shop3'): 55, 例如,我想找出项目1的平均价格。是否可以使用多键词典,或者我应该更改它?有什么想法吗 谢谢,这是可能的。不确定这是否是解决问题的正确数据结构,但您可以这样做 首先,选择所需项目的所有键,这里我选择'item1': interesting_keys = filte

我想在一本字典中找到一件物品的平均价格,它有成对的物品,商店是关键,价格是价值

示例词典

{('item1', 'shop1'): 40,
('item2', 'shop2'): 14,
('item1', 'shop3'): 55,
例如,我想找出项目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()}

您可以使用嵌套列表创建数据帧。然后,您可以使用Pandas
groupby
获取您要查找的
平均值

    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级分组:

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

我将使用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

你想在所有商店里找到一件商品的平均价格吗?我想知道所有商品的平均价格。为什么贴上熊猫标签?因为我在使用pandas,如果我想在所有商品上都贴上熊猫标签?你是什么意思?比如,如果你想把每一个可能的项目的信息结合起来?是的,不仅针对item1,而且针对每个item,创建一个新的数据结构,每个item的平均值我添加了一个函数,可能会对您有所帮助我已经尝试了使用series和dataframes,但我认为,由于我想使用平均值数据结构从我的原始字典中减去,如果它也是一个字典就更好了。但是我可能错了……我还在学习:)我怎么才能把它和字典进行比较呢?如果你有200万行的字典,我们熊猫读的是_csv之类的东西,字典groupby将是O(N),一旦你构建了groupby pandas groupby/mean将更像O(1).我试过了,但是当我想从原始值(一个数据帧和另一个数据帧)中减去平均值时,每次都会得到一个死内核。这就是我放弃使用DataFrames的原因请问一个关于这个特定错误(死掉的内核错误)的问题。2米不是很多,熊猫应该很容易处理。这个问题本身就有问题。谢谢你的回答。我已经用dataframe试过了,但是我想用它来做一些计算,它非常慢。我最初的数据结构是一个字典,我认为使用dictionary@mnmbs您的问题中有
pandas
标记,因此,我提供了pandas的答案。顺便说一句:
pandas
并不慢。是的,但我也说我在问字典。但是没关系。再次感谢,请相信我,如果你有200万行的文件,它可能会很慢