给定输入文件的列统计信息?

时间:2016-12-08 02:02:27

标签: python list matrix

我收到一个.txt数据文件:

1,2,3,0,0
1,0,4,5,0
1,1,1,1,1
3,4,5,6,0
1,0,1,0,3
3,3,4,0,0

我的目标是计算给定数据的的最小值,最大值,平均值,范围,中位数,并将其写入输出.txt文件。

我接近这个问题的逻辑如下

步骤1)阅读数据

infile = open("Data.txt", "r")
tempLine = infile.readline()
while tempLine:
   print(tempLine.split(','))
   tempLine = infile.readline()

显然它并不完美但是这个想法是可以通过这个来读取数据......

步骤2)将数据存储到相应的列表变量中? row1,row2,... row6

步骤3)将上面的所有列表合并为一个,给出这样的最终列表...

flist =[[1,2,3,0,0],[1,0,4,5,0],[1,1,1,1,1],[3,4,5,6,0],[1,0,1,0,3],[3,3,4,0,0]]

步骤4)使用嵌套for循环,单独访问元素并将它们存储到列表变量

col1, col2, col3, ... , col5

步骤5)计算min,max等并写入输出文件

我的问题是,凭借我对计算机科学和python的初学者知识,这种逻辑效率低下,是否可能有更简单,更好的逻辑来解决这个问题?

我的主要问题可能是第2步到第5步。其余的我知道该怎么做。

任何建议都会有所帮助!

4 个答案:

答案 0 :(得分:1)

要获取数据,我会这样:

from statistics import median
infile = open("Data.txt", "r")
rows = [line.split(',') for line in infile.readlines()]
for row in rows:
    minRow = min(row)
    maxRow = max(row)
    avgRow = sum(row) / len(row)
    rangeRow = maxRow - minRow
    medianRow = median(row)
    #then write the data to the output file

答案 1 :(得分:1)

尝试numpy。 Numpy库在处理列表中的嵌套列表时提供快速选项,或简称为矩阵。

要使用numpy,您必须在代码的开头import numpy

numpy.matrix(1,2,3,0,0;1,0,4,5,0;....;3,3,4,0,0)

会给你 flist =[[1,2,3,0,0],[1,0,4,5,0],[1,1,1,1,1],[3,4,5,6,0],[1,0,1,0,3],[3,3,4,0,0]]直接蝙蝠。

此外,您可以通过轴(在本例中为行)查看并轻松获取平均值,最小值,最大值

max([axis, out])    Return the maximum value along an axis.
mean([axis, dtype, out])    Returns the average of the matrix elements along the given axis.
min([axis, out])    Return the minimum value along an axis.

这是来自https://docs.scipy.org/doc/numpy/reference/generated/numpy.matrix.html,这是一个numpy文档,所以如需更多信息,请阅读numpy文档。

答案 2 :(得分:0)

您可以使用pandas库(http://pandas.pydata.org/

以下代码对我有用:

import pandas as pd
df = pd.read_csv('data.txt',header=None)
somestats = df.describe()
somestats.to_csv('dataOut.txt')

答案 3 :(得分:0)

如果有人好奇,我就是这样做的

import numpy

infile = open("Data1.txt", "r")
outfile = open("ColStats.txt", "w")

oMat = numpy.loadtxt(infile)
tMat = numpy.transpose(oMat) #Create new matrix where Columns of oMat becomes rows and rows become columns

#print(tMat)

for x in range (5):
    tempM = tMat[x]

    mn = min(tempM)
    mx = max(tempM)
    avg = sum(tempM)/6.0
    rng = mx - mn
    median = numpy.median(tempM)

    out = ("[{} {} {} {} {}]".format(mn, mx, avg, rng, median))
    outfile.write(out + '\n')

infile.close()
outfile.close()

#print(tMat)