给出一个收入值表:
要注意的一个关键点(以及我的问题的核心)是品牌名称几乎始终(但并非总是)包含相应的产品名称。在上一次香蕉入境的情况下,它没有。
我将提取{{1>}个品牌< - >收入对,对那些有多个条目的品牌进行会计处理,并在这些情况下进行求和,使用所描述的方法{{ 3}}。所以:
dict
然后,我会将此dict中的键和值交叉引用到(香蕉费用的词汇,kiwi 费用等词汇表)中的每个词典中,并减去来自收入的费用,每件商品。这些dicts将从香蕉桌,猕猴桃桌等中提取出来,如下所示:
如果品牌名称始终在收入表中包含产品名称,那么为了编制适当的收入值集合以与香蕉费用字典进行比较,例如,我只会提取所有那些名字包含香蕉'的品牌,以及香蕉费用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 是香蕉等)
答案 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')))