从列中查找平均值

时间:2016-01-28 23:48:33

标签: python python-3.x

我正在使用这个名为Gradedata.txt的txt文件,它看起来像这样:

Sarah K.,10,9,7,9,10,20,19,19,45,92
John M.,9,9,8,9,8,20,20,18,43,95
David R.,8,7,7,9,6,18,17,17,40,83
Joan A.,9,10,10,10,10,20,19,20,47,99
Nick J.,9,7,10,10,10,20,20,19,46,98
Vicki T.,7,7,8,9,9,17,18,19,44,88

我正在寻找每列的平均值。每列都有自己的标题(家庭作业#1,家庭作业#2等,按此顺序)。我想要做的应该是这样的:

Homework #1        8.67
Homework #2        8.17
Homework #3        8.33
Homework #4        9.33
Homework #5        8.83
Quiz #1           19.17
Quiz #2           18.83
Quiz #3           18.67
Midterm #1        44.17
Final #1          92.50

以下是我完成此任务的尝试:

with open("GradeData.txt", "rtU") as f:
    columns = f.readline().strip().split(" ")
    numRows = 0
    sums = [0] * len(columns)

    for line in f:

        if not line.strip():
            continue

        values = line.split(" ")
        for i in xrange(len(values)):
            sums[i] += int(values[i])
        numRows += 1

    for index, summedRowValue in enumerate(sums):
        print columns[index], 1.0 * summedRowValue / numRows

我收到错误,而且我意识到我必须将每个分配命名为平均值。这里需要一些帮助。我很感激。

2 个答案:

答案 0 :(得分:1)

只需转置并使用statistics.mean获取平均值,跳过第一个col:

import csv
from itertools import islice
from statistics import mean

with open("in.txt") as f:
    for col in islice(zip(*csv.reader(f)), 1, None):
        print(mean(map(float,col)))

哪个会给你:

8.666666666666666
8.166666666666666
8.333333333333334
9.333333333333334
8.833333333333334
19.166666666666668
18.833333333333332
18.666666666666668
44.166666666666664
92.5

如果列实际已命名,并且您想要将它们配对:

import csv
from itertools import islice
from statistics import mean

with open("in.txt") as f:
    # get column names
    cols = next(f).split(",")
    for col in islice(zip(*csv.reader(f)),1 ,None):
        # keys are column names, values are averages
        data = dict(zip(cols[1:],mean(map(float,col))))

或使用pandas.read_csv

import pandas as pd

df = pd.read_csv("in.txt",index_col=0,header=None)

print(df)
print(df.mean(axis=0))

          1   2   3   4   5   6   7   8   9   10
0                                               
Sarah K.  10   9   7   9  10  20  19  19  45  92
John M.    9   9   8   9   8  20  20  18  43  95
David R.   8   7   7   9   6  18  17  17  40  83
Joan A.    9  10  10  10  10  20  19  20  47  99
Nick J.    9   7  10  10  10  20  20  19  46  98
Vicki T.   7   7   8   9   9  17  18  19  44  88
1      8.666667
2      8.166667
3      8.333333
4      9.333333
5      8.833333
6     19.166667
7     18.833333
8     18.666667
9     44.166667
10    92.500000
dtype: float64

答案 1 :(得分:1)

numpy可以在一行中咀嚼这个:

>>> np.loadtxt('Gradedata.txt', delimiter=',', usecols=range(1,11)).mean(axis=0)
array([  8.66666667,   8.16666667,   8.33333333,   9.33333333,
         8.83333333,  19.16666667,  18.83333333,  18.66666667,
        44.16666667,  92.5       ])