如何识别"键"一个元组/三项元组列表?

时间:2015-07-03 20:49:09

标签: python python-2.7 dictionary key tuples

给出一个收入值表:

enter image description here

要注意的一个关键点(以及我的问题的核心)是品牌名称几乎始终(但并非总是)包含相应的产品名称。在上一次香蕉入境的情况下,它没有。

我将提取{{1>}个品牌< - >收入对,对那些有多个条目的品牌进行会计处理,并在这些情况下进行求和,使用所描述的方法{{ 3}}。所以:

dict

然后,我会将此dict中的键和值交叉引用到(香蕉费用的词汇,kiwi 费用等词汇表)中的每个词典中,并减去来自收入的费用,每件商品。这些dicts将从香蕉桌,猕猴桃桌等中提取出来,如下所示:

enter image description here

如果品牌名称​​始终在收入表中包含产品名称,那么为了编制适当的收入值集合以与香蕉费用字典进行比较,例如,我只会提取所有那些名字包含香蕉'的品牌,以及香蕉费用dict中的匹配键,都会对其价值进行提取。

但它没有,所以我需要另一种方式来了解收入词典,' OtherBrand'是香蕉。(在 Banana dict中,我已经知道它是香蕉,因为它来自Banana表)。我可以提取((产品,品牌,收入)元组的列表或元组,而不是提取revenuePerBrandDict = {} brandRevenueTuples = [] i=0 for brand in ourTab.columns[1][1:-1]: # ignore first (zeroth) and last row brandRevenueTuples.append((campaign.value, round(ourTab.columns[3][i].value,2))) i+=1 for key, value in brandRevenueTuples: revenuePerBrandDict[key] = revenuePerBrandDict.get(key, 0) + value 品牌< - >收入对,现在我们可以获得产品列。但是由于元组没有密钥的概念,我如何迭代这个新集合,以期望的方式提取每个元组的收入(即认识到 OtherBrand 是香蕉等)

2 个答案:

答案 0 :(得分:1)

在我看来,您希望按产品类型对第一个表中的数据进行分组。我建议使用一个字典,其中键是产品类型,值是元组[(brand, revenue),(..., ...)]的列表。

然后,对于字典中的每种产品类型,您可以轻松提取该产品的品牌列表,并根据需要制作包含3元组(brand, revenue, expenses)列表的新字典。

答案 1 :(得分:1)

您可以将水果用作钥匙并将品牌分组:

from collections import defaultdict
import csv

with open("in.csv") as f:
    r = csv.reader(f)
    next(r) # skip header
    # fruite will be keys, values will be dicts
    # with brands as keys  and running totals for rev as values
    d = defaultdict(lambda: defaultdict(int))
    for fruit, brand, rev in r:
        d[fruit][brand] += float(rev)

使用您的输入输出:

from pprint import pprint as pp

pp(dict(d))
{'Apple': defaultdict(<type 'int'>, {'CrunchApple': 1.7}),
 'Banana': defaultdict(<type 'int'>, {'BananaBrand': 4.0,   'OtherBrand': 3.2}),
 'Kiwi': defaultdict(<type 'int'>, {'NZKiwi': 1.2}),
 'Pear': defaultdict(<type 'int'>, {'PearShaped': 6.2})

然后您可以使用键减去费用。

使用pandas生活更容易,你可以分组和总结:

import pandas as pd

df = pd.read_csv("in.csv")

print(df.groupby(("A","B")).sum())

输出:

A      B               
Apple  CrunchApple  1.7
Banana BananaBrand  4.0
       OtherBrand   3.2
Kiwi   NZKiwi       1.2
Pear   PearShaped   6.2

或者通过水果和品牌获得团体:

groups = df.groupby(["A","B"])

print(groups.get_group(('Banana', 'OtherBrand')))

print(groups.get_group(('Banana', 'BananaBrand')))