2017-01-20 2 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 

残念ながら私は、任意の外部のlibを使用することはできません。だから、パンダはここではオプションではない。私が得たどのくらいです

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) 

のような元の形式のものに書き戻すEDIT:

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

ありがとうございました。 {'f':1、 'b':1、 'c':1、 'a':2}、 'Part_2':{'c':1}この結果は返されます。 、 'a':3}}となります。現時点で私の頭を壊しているのは、元の形式に戻すにはどうすればいいのですか?コピーする必要がある列がさらに多い場合はどうすればよいですか? – himself

+0

元の形式に書き戻すための編集を参照してください。これは質問に答えますか? Upvote? –

+1

はい。私は評判を欠場するので、私はupvoteすることはできません。ありがとうございました!、...ちょうど私がチェックできることを実現! – himself

1

大変申し訳ありませんが、パンダを使用しています。次に、ファイルを読み込んで、結果をdefaultdictに保存します。

from collections import defaultdict 
grouped = defaultdict(int) 

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

次にあなたがファイルに

+1

おかげで、私は私が原因しようとした、失敗した – himself

+0

それをインストールすることはできませんと私はパンダを使用することはできません。グループ化+ = countはエラーになります: "+ =: 'int'と 'str'のサポートされていないオペランドタイプです。 – himself

+0

@himself 'grouped [(level、type)] + = int(count)'文字列として読み込み、カウントを整数に変換する必要があります。 – Javier

関連する問題