2017-05-19 4 views
0

私はpclassという名前のカラムを持っています。値は'1', '2' or '3'です。 pythonを使用して、各値のインスタンス数を確認しています。私のコードがcsvの列の値を検出しないのはなぜですか?

合計の割合(%)として表示します。 '1'の値では動作しますが、'2''3'では動作しません。 ?私が間違っているのは何

*は

私のコードは以下の通りです:

import csv 
pclass = 0 
pclass1 = [1] 
pclass2 = [2] 
pclass3 = [3] 

pclass1_values = 0 
pclass2_values = 0 
pclass3_values = 0 

total = 891 

with open('titanic-new.csv', newline='') as csvfile: 
    csv_reader = csv.reader(csvfile, delimiter= ',') 
    next(csv_reader, None) 
    for row in csv_reader: 
     if int(row[pclass]) in pclass1: 
      pclass1_values += 1 
    for row in csv_reader: 
     if int(row[pclass]) in pclass2: 
      pclass2_values += 1 
    for row in csv_reader: 
     if int(row[pclass]) in pclass3: 
      pclass3_values += 1 

    print('total: {}, pclass1: {} ({:.2f}%)'.format(total, pclass1_values, 
              pclass1_values/total*100)) 

    print('total: {}, pclass2: {} ({:.2f}%)'.format(total, pclass2_values, 
               pclass2_values/total * 100)) 

    print('total: {}, pclass3: {} ({:.2f}%)'.format(total, pclass3_values, 
               pclass3_values/total * 100)) 

input('press ENTER to exit') 
+1

をまとめますか? 1つのループだけで物事を作ることができます。 –

+0

forループを削除してもまだ動作しません:9 –

+0

まだタイタニックで沈んでいますか?私が示唆したようにあなたがパンダを使用していたなら、あなたは3番目または4番目の船を完成させるためにあなたの上にうまくいくでしょう – e4c5

答えて

2

あなたの変数csv_readerジェネレータ、あなたはそれを反復したときに3を崩壊する必要がありますので、排出されます1

からfor -loopsは仕事にこれを取得する最も簡単な方法は、カウンターで次のようになります。

import csv 
from collections import Counter 

pclass_col = 0 
c = Counter() 

ループの3がありますなぜファイルを読み込む

with open('titanic-new.csv', newline='') as csvfile: 
    csv_reader = csv.reader(csvfile, delimiter= ',') 
    next(csv_reader, None) 
    for row in csv_reader: 
     c(int(row[pclass_col]) += 1 

は結果

total = sum(c.values()) 

classes = { 
    'pclass1': (1,), 
    'pclass2': (2,), 
    'pclass3': (3,), 
} 

for pclass, pclass_values in classes.items(): 
    pclass_value = sum(c[k] for k in pclass_values) 
    msg = 'total: {}, {}: {} ({:.2f}%)'.format(total, pclass, pclass_values, pclass_value/total * 100) 
    print(msg) 
関連する問題