2017-01-20 59 views
0

我想在csv文件中添加行(它是BOM),如果它們是相同的並且位於同一部分中,但不是如果它們是特定類型。 這裏是讓它能夠更加清晰:如何在csv數據中實現python3.x中的「sumif」

LevelName,Type,Amount 
Part_1,a,1 
Part_1,a,1 
Part_1,b,1 
Part_1,c,1 
Part_1,d,1 
Part_1,f,1 
Part_2,a,1 
Part_2,c,1 
Part_2,d,1 
Part_2,a,1 
Part_2,a,1 
Part_2,d,1 
Part_2,d,1 

,所以我需要一個部分但如果類型是「d」內的一些的所有類型。 結果應該是這樣的:

LevelName,Type,Amount 
Part_1,a,2 
Part_1,b,1 
Part_1,c,1 
Part_1,d,1 
Part_1,f,1 
Part_2,a,3 
Part_2,c,1 
Part_2,d,1 
Part_2,d,1 
Part_2,d,1 

不幸的是我不能使用任何外部庫。所以熊貓在這裏不是選擇。

這是我在多大程度上得到:

import csv 
map = {} 
with open('infile.csv', 'rt') as f: 
    reader = csv.reader(f, delimiter = ',') 
    with open('outfile.csv', 'w', newline='') as fout: 
     writer = csv.writer(fout, delimiter=';', quoting=csv.QUOTE_MINIMAL) 
     writer.writerow(next(reader)) 
     for row in reader: 
      (level, type, count) = row 
      if not type=='d': 

那麼,在這裏我只是沒有得到提前... 感謝您的任何提示!

回答

0
import csv 
import os 
cwd = os.getcwd() 

master = {} 
file = csv.DictReader(open(cwd+'\\infile.csv', 'rb'), delimiter=',') 
data = [row for row in file] 

for row in data: 
    master.setdefault(row['LevelName'], {}) 
    if row['Type'] != 'd': 
     master[row['LevelName']].setdefault(row['Type'], 0) 
     master[row['LevelName']][row['Type']] += int(row['Amount']) 

print (master) 

還不如上面的soloution簡單文件,但這顯示瞭如何在數據

或者我想你遍歷可以連接'LevelName'和'Type',這樣你就可以少用一行代碼。這取決於你想要什麼。

for row in data: 
    if row['Type'] != 'd': 
     master.setdefault(row['LevelName'] + row['Type'], 0) 
     master[row['LevelName'] + row['Type']] += int(row['Amount']) 

print (master) 

編輯

寫回原來的格式是這樣的:

out = open(cwd+'\\outfile.csv', 'wb') 
out.write('LevelName,Type,Amount\n') 
for k,v in master.iteritems(): 
    for z in v: 
     out.write('%s,%s,%s\n' % (k, z, str(v[z]))) 
+0

非常感謝。因此結果如下:{'Part_1':{'f':1,'b':1,'c':1,'a':2},'Part_2':{'c':1 ,'a':3}}。此刻正在打破我的頭腦的是,如何才能將其恢復到原始格式?如果還有更多列需要複製,我該怎麼辦? – himself

+0

請參閱編輯以回寫原始格式。這是否回答這個問題?給予好評? –

+1

是的。因爲我錯過了聲望,我無法贊成。非常感謝!,只是意識到我可以檢查! – himself

1

對不起使用熊貓。然後首先讀取將結果保存在defaultdict中的文件。

from collections import defaultdict 
grouped = defaultdict(int) 

if not type=='d': 
    grouped[(level, type)] += int(count) 

然後你就可以在字典的結果保存到

+1

感謝,但我不能安裝它 – himself

+0

我嘗試和失敗,原因是我不能用熊貓:分組[(level,type)] + = count會導致一個錯誤:「不支持的操作數類型爲+ =:'int'和'str'」閱讀一些內容並不能指出我的解決方案。 – himself

+0

@himself'groupped [(level,type)] + = int(count)'你會將它作爲字符串讀取,並且需要將count轉換爲整數 – Javier

相關問題