我有一个数据文件,在七列数字中有6行数字。
示例:
5 8 3 21 10 99 3
14 20 100 34 94 2 3
4 2 102 330 101 3 9
9 22 77 721 30 4 9
99 3 4 1 0 55 8 4
8 90 3 1 99 4 101
我有以下代码,想知道如何找到每行的平均值,然后是每行。
def main():
fileName = input("Enter the name of the data file: ")
print()
infile = open(fileName, "r")
# get data
sum = 0
count = 0
data = infile.read().strip().split()
for line in len(data):
sum = sum / len(data)
print("This is sum: ", sum)
main()
我可能只打开一次文件,我必须用循环完成所有操作,这意味着我必须对列和第一个循环中的外观中的行进行所有数学运算。输出应该类似于:
有可能在转入时,我的教师可能会将数据文件设置为包含7个以上的列和6个行。因此,代码必须能够适应这种变化。下面的输出来自另一个有类似程序的人,但是使用了固定文件格式。如果添加了新的列,例如5,10,15,20,25,95,100等等或另外一辆汽车,该代码将无效。
Speed (MPH)
Car : 30 40 50 60 70 80 90 : Average Noise
----------------------------------------------------------------------------
1 : 88 90 94 98 100 110 120 : 100.0
2 : 75 77 80 86 94 103 113 : 89.7
3 : 80 83 85 94 111 111 121 : 97.9
4 : 68 71 76 85 96 122 125 : 91.9
5 : 77 84 91 102 105 112 119 : 98.6
6 : 81 85 90 96 102 109 134 : 99.6
----------------------------------------------------------------------------
Average : 78.2 81.7 86.0 93.5 101.3 111.2 122.0
Maximum : 88 90 94 102 111 122 134
任何人都知道如何做到这一点?一切都必须灵活,以便根据导入的数据文件进行更改。就像excel表一样。
答案 0 :(得分:0)
以下是我如何完成家庭作业
首先阅读csv。但是,由于读取文件的正常方式会给我们字符串列表。因此,使用read_lines
函数 - 将字符串列表转换为浮点数。
import csv
def read_lines(csvfile):
with open(csvfile, 'rU') as data:
reader = csv.reader(data)
for row in reader:
yield [float(cell) for cell in row ]
cars = list(read_lines('car.csv'))
cars
[[88.0, 90.0, 94.0, 98.0, 100.0, 110.0, 120.0],
[75.0, 77.0, 80.0, 86.0, 94.0, 103.0, 113.0],
[80.0, 83.0, 85.0, 94.0, 111.0, 111.0, 121.0],
[68.0, 71.0, 76.0, 85.0, 96.0, 122.0, 125.0],
[77.0, 84.0, 91.0, 102.0, 105.0, 112.0, 119.0],
[81.0, 85.0, 90.0, 96.0, 102.0, 109.0, 134.0]]
找到csv文件的维度 - 汽车和速度。
# Number of speeds
speed_no = float(len(cars[0]))
# Number of cars
cars_no = float(len(cars))
逐行,找出在不同速度值下聚合的每一行(汽车)的平均值。
# Per car, average value across speed values
for row, car in enumerate(cars):
print row, sum(car)/speed_no
0 100.0
1 89.7142857143
2 97.8571428571
3 91.8571428571
4 98.5714285714
5 99.5714285714
而且,我们需要一个函数从数组中提取第n列(列表列表)
def nth_col(passlist, n):
return map(lambda x : x[n], passlist)
最后,逐列,找出速度值(即每速度)的平均值,最大值
# Per speed, max and average of car values
for num in range(int(speed_no)):
nth_car = nth_col(cars, num)
print num, max(nth_car), sum(nth_car)/cars_no
0 88.0 78.1666666667
1 90.0 81.6666666667
2 94.0 86.0
3 102.0 93.5
4 111.0 101.333333333
5 122.0 111.166666667
6 134.0 122.0
但是,我更喜欢NumPy / Pandas版本的循环。
Numpy版本
您可以使用NumPy
In [30]: import numpy as np
In [37]: np_arr = np.genfromtxt('car.csv', delimiter=',', skip_header=1)
In [39]: np_arr
Out[39]:
array([[ 88., 90., 94., 98., 100., 110., 120.],
[ 75., 77., 80., 86., 94., 103., 113.],
[ 80., 83., 85., 94., 111., 111., 121.],
[ 68., 71., 76., 85., 96., 122., 125.],
[ 77., 84., 91., 102., 105., 112., 119.],
[ 81., 85., 90., 96., 102., 109., 134.]])
列式意味着
In [41]: np_arr.mean(axis=0)
Out[41]:
array([ 78.16666667, 81.66666667, 86. , 93.5 ,
101.33333333, 111.16666667, 122. ])
行式意味着
In [42]: np_arr.mean(axis=1)
Out[42]:
array([ 100. , 89.71428571, 97.85714286, 91.85714286,
98.57142857, 99.57142857])
column-wise max
In [43]: np_arr.max(axis=0)
Out[43]:
array([ 88., 90., 94., 102., 111., 122., 134.])
我将离开Pandas版本供您试用。
答案 1 :(得分:0)
一些事情:
您需要围绕len(数据)的range()函数进行迭代。
如果你想要一个平均值,你得到的等式:sum = sum / len(data)
将找不到平均值。你必须在某处总结这些值。目前您的0 /某些值= 0.如果您使用sum += sum + data[line] / len(data)
可行。或者,您可以对循环中的值求和,然后除以条目数。这两种方法是等价的。在前者中,您只需将每个连续值添加到总和,然后进行除法。然而,在遵循代码方面,如果你做后者,可能会更清楚,分别显示每个步骤。
关于格式:我不想为此付出一切,因为这似乎是你的家庭作业的大部分,但会提供一些提示。 您应该跟踪每行中的条目数,并将条目的最大值存储在某个变量中。这样,当你去格式化表格时,你可以调用这个变量来决定你需要制作多少列。在调整行数的方面,使用for循环,其中循环的每次迭代构成其中一行。在开始这个for循环之前,它会生成标题(你的-----行和它上面的所有内容),然后在for循环之后让它成为页脚(你的-----行及其下面的所有内容)。
对于底部的最大行,我建议创建一个dict来存储每行的最大值。使用列值作为键和一些逻辑来测试与键关联的存储值是否大于当前存储值,如果是,则替换它。
最后,您应该记得关闭文件。你在开始时打开它,但没有关闭它。
希望这有帮助。