根据另一列中的值写入现有列

时间:2014-10-10 19:22:00

标签: python

给出一组数据

'Student ID',   'Grade',    'Weight'
'111112',       '76',       '24'
'111112',       '66',       '14'
'222223',       '46',       '14'
'333334',       '96',       '18' 
'444445',       '56',       '17'

我如何通过行来仅选择"等级"列,并将等效的字母等级写入名为"字母等级"的新列。到目前为止我所做的是制作新专栏,但我不知道如何填写从"等级"柱。

with open(args.source, 'rb') as source_file:
    with open(args.output, 'wb') as output_file:
        reader = csv.reader(source_file, delimiter = '\t')
        writer = csv.writer(output_file, lineterminator = '\n')
        headers = next(reader, None)

        if headers:
            writer.writerow(headers + ['Letter Grade'])

    print('Done.')

2 个答案:

答案 0 :(得分:0)

首先,您必须定义从Letter Grade中制作Grade的规则。然后,您可以将该规则转换为代码。我会使用一个简单的,任何等级> = 60一个P,以及其他任何F

for student_id, grade, weight in reader:
    numeric_grade = int(grade)
    letter_grade = 'P' if numeric_grade >= 60 else 'F'
    writer.writerow((student_id, grade, weight, letter_grade))

无论你的实际规则是什么,你都应该能够弄清楚如何用它代替我的单行代码。

如果您现有的代码以不同的方式迭代行 - 例如,使用for row in reader:然后依赖row[0]row[1] - 再次显而易见的是如何调整我的-liner适合你正在做的事情(以及写row + [letter_grade]等)。

答案 1 :(得分:0)

def get_letter_grade(score):
    # define your own rules here

    if score<50:
        return "F"
    if score <60:
        return "D"
    if score<70:
        return "C"
    if score<80:
        return "B"
    return "A"

with open(args.source, 'r') as source_file, open(args.output, 'w') as output_file:
    writer = csv.writer(output_file, lineterminator='\n')
    reader = csv.reader(soure_file, delimiter=',')
    headers = next(reader)
    headers.append('Letter Grade')

    for row in reader:
        row = [i.strip().replace("'", '') for i in row]
        grade = int(row[1])
        letter_grade = get_letter_grade(grade)
        writer.writerow(row + [letter_grade])