2017-05-17 7 views
0

私はcsv(https://ufile.io/y4nr9)を '、'で区切り、 'name'、 'survived'、 'sex'などの列を含んでいます。私は生き残っていない男性のパーセンテージを見つけ出したいと思います。統計。ここまでのコードはcsvで2つの列をフィルタリングする方法は?

import csv 
reader = csv.reader(open('titanic-new_alphabetized.csv'), delimiter= ',') 
filtered = filter(lambda p: 'male' == p[3], reader) 
dict = [] 

input('press ENTER to exit') 
+1

したがって、最初の列(0と1)は生き残り/生き残られませんか?それは...ですか? –

+0

あなたはどのバージョンのPythonを使用していますか?後で 'dict'に何を期待しますか?変数には、そのような組み込み型と同じ名前を決して指定するべきではありません。 – martineau

+0

私はpython 3を使用しています – csStudent

答えて

0

あなたはそれらをフィルタリングし、Python 3で、このような統計量を計算することができます:

import csv 

total, survived = 0, 0 

with open('titanic-new_alphabetized.csv', newline='') as csvfile: 
    for row in filter(lambda p: 'male'==p[3], csv.reader(csvfile, delimiter= ',')): 
     total += 1 
     if int(row[0]): 
      survived += 1 

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

出力:

total: 577, survived: 109 (18.89%) 
+0

完璧、ありがとうございます。 – csStudent

+0

今、12歳以下の人の割合が生き残っていないことを知りたいのですが、それでも生き残っていない人の平均は「男性」を「≤12」== p [4] – csStudent

+0

に変更することができます。 DIDNTが生き残っている男性の割合が「0」であることを確認しようとしています。 「生き残った+ = 1」というのは、生き残った人を探していることを意味していますか? – csStudent

0

listの構文を使用して作成しています。

あなたは、後で簡単に閉じることができますので、あなたはまた、変数としてファイルを開く必要があるのdict = {}

0

を使用する必要があります。

またはファイルを開くにはwith ... asを使用してください。

0

あなたは、これを試す最初の空のリストを削除してからパーセントを取得するためにリストをフィルタリングすることができます

import csv 

reader = csv.reader(open('1.csv'), delimiter=',') 

data = filter(lambda p: p, list(reader)) # remove empty list 
filtered=filter(lambda p: p[0]=='0' and p[3] == 'male', data) 

print(len(filtered)*1.0/len(data)) 

結果

0.525252525253 
0

あなたのを読むためにcsv.DictReaderを()を使用することができますcsvをdictのリスト(ここでは列名としてc1、c2 ..と指定していますが、その重要性は確かにありません)。その手で、あなたが日付を反復処理し、男性のエントリをチェックして、リストmen

に生存日付を取得するには、リストの内包表記を使用することができます今、あなたは生き残るdidntの男性の平均を見つけることができると

(仮定'0' は生きているのために死んだと '1' の意味)

import csv 
with open('names.csv') as file: 
    reader = csv.DictReader(file, delimiter= ',',fieldnames=['c1','c2','c3','c4','c5','c6','c7']) 
    #print reader # [{'c3': 'Abbing, Mr. Anthony', 'c2': '3', 'c1': '0', 'c7': '7.55', 'c6': 'C.A. 5547', 'c5': '42', 'c4': 'male'}, {'c3': '', 'c2': '', 'c1': '', 'c7': '', 'c6': '', 'c5': '', 'c4': ''}, {'c3': 'Abbott, Mr. Rossmore Edward', 'c2': '3', 'c1': '0', 'c7': '20.25', 'c6': 'C.A. 2673', 'c5': '16', 'c4': 'male'}...] 
    men = [each['c1'] for each in reader if each['c4']=='male'] 
    #print men #['0', '0', '0', '0', '1'...] 
    print men.count('0')*100/len(men) 
input('press ENTER to exit') 
+0

列名は: '生き残った'、 'pclass'、 '名前'、 'セックス'、 '年齢'、 'チケット'、 '運賃'、 'キャビン'それぞれの['c4'] == 'male'] ===> men = [each '' survived ']が読者であれば、 ] == '男性'] – csStudent

+0

ええ、あなたもフィールド名を変更する必要があります! –

+0

フィールド名に言及しないと、csvの最初の行が列名として扱われます。限り、私は推測することができます、あなたの入力ファイルは、csvの最初の行として列名を持っていない。したがって明示的に言及する必要があります! –

関連する問題