如何过滤csv中的两列?

时间:2017-05-17 02:57:26

标签: python python-3.x csv

所以我有一个csv(https://ufile.io/y4nr9),它被','分开。并包含以下列:' name','幸存''性别'我想找到没有生存的男性百分比并打印统计数据。到目前为止,这是我的代码:

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')

5 个答案:

答案 0 :(得分:0)

您正在使用list语法创建字典。

你应该使用dict = {}

答案 1 :(得分:0)

您还应该将文件作为变量打开,以便稍后可以轻松关闭它。

或使用with ... as打开文件。

答案 2 :(得分: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

答案 3 :(得分:0)

您可以使用csv.DictReader()将您的csv作为dict列表读取(这里我已经将列名称命名为c1,c2 ..因为我确定它们的意义)。

有了这个,你可以使用列表理解来迭代日期并检查男性的条目,并将生存日期列入列表men

现在你可以找到没有生存的男人的平均数(假设'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')

答案 4 :(得分: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%)