2016-09-30 79 views
4

我是python的新手,我现在可以真正使用你的帮助和指导。我想基于第一和第二列读三米的cols一个CSV文件,并做一些计算即通过动态创建嵌套字典来计算聚合

A spent 100  A spent 2040 
A earned 60 
B earned 48 
B earned 180 
A spent 40 
. 
. 
. 

其中A花了2040将是除了所有“A”和“花”数额。这不会给我一个错误,但它不是逻辑上是正确:

for row in rows: 
    cols = row.split(",") 
    truck = cols[0] 
    if (truck != 'A' and truck != 'B'): 
     continue 
    record = cols[1] 
    if(record != "earned" and record != "spent"): 
     continue 
    amount = int(cols[2]) 
    #print(truck+" "+record+" "+str(amount)) 

    if truck in entries: 
     #entriesA[truck].update(record) 
     if record in records: 
      records[record].append(amount) 
     else: 
      records[record] = [amount] 
    else: 
     entries[truck] = records 
     if record in records: 
      records[record].append(amount) 
     else: 
      entries[truck][record] = [amount] 
print(entries) 

我知道,这部分不正确,因为我会被添加相同的内部词典列表外的字典,但我不知道如何从那里:

entries[truck] = records 
if record in records: 
    records[record].append(amount) 

然而,林不知道的语法来动态创建一个新的字典,不会是“记录”

我越来越:

{'B': {'earned': [60, 48], 'spent': [100]}, 'A': {'earned': [60, 48], 'spent': [100]}} 

但希望能得到:

{'B': {'earned': [48]}, 'A': {'earned': [60], 'spent': [100]}} 

感谢。

+0

这个术语是*“A的总支出是2040”*。是的,熊猫包是这样做的,强烈推荐。 – smci

+1

更好地短语问题*“如何计算聚合?”*比询问实现*“创建嵌套字典”*。阅读有关拆分应用组合范例。 – smci

+0

在你的预期结果中,你为什么期望B的收入是48而不是228?类似的花费,不应该是140吗?你提到了你的问题的总和,但现在看来你只想要第一个? – chthonicdaemon

回答

0
if record in entries[truck]: 
    entries[truck][record].append(amount) 
else: 
    entries[truck][record] = [amount] 

我相信这是你想要的吗?现在我们直接访问卡车的记录,而不是试图检查本地字典records。就像你如果没有卡车进入一样。

+0

谢谢@Nysten,但我仍然有同样的问题 – Heap

2

对于你在这里做的计算,我强烈推荐Pandas

假设in.csv看起来是这样的:

truck,type,amount 
A,spent,100 
A,earned,60 
B,earned,48 
B,earned,180 
A,spent,40 

你可以做的共计有三行代码:

import pandas 
df = pandas.read_csv('in.csv') 
totals = df.groupby(['truck', 'type']).sum() 

totals现在看起来是这样的:

   amount 
truck type   
A  earned  60 
     spent  140 
B  earned  228 

你会发现熊猫可以让你在更高的层次上思考,避免烦恼在这种情况下使用较低级别的数据结构。