嗨,这是我的问题。我有一个计算列中数据平均值的程序。


Bob
1
2
3


输出是

Bob
2


有些数据带有“ na”
对乔来说

Joe
NA
NA
NA


我希望此输出为NA

所以我写了一个if else循环

问题在于它不执行循环的第二部分,而只是打印出一个NA。有什么建议么?

这是我的程序:

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

    numRowsPerColumn = [0] * len(columns) # this figures out the number of columns

    for line in f:
        # Skip empty lines since I was getting that error before
        if not line.strip():
            continue

        values = line.split(" ")
        for i in xrange(len(values)):
            try: # this is the whole strings to math numbers things
                sums[i] += float(values[i])
                numRowsPerColumn[i] += 1
            except ValueError:
                continue

    with open('c://chipdone.txt', 'w') as ouf:
        for i in xrange(len(columns)):
           if numRowsPerColumn[i] ==0 :
               print 'NA'
           else:
               print>>ouf, columns[i], sums[i] / numRowsPerColumn[i] # this is the average calculator


该文件如下所示:

Joe Bob Sam
1 2 NA
2 4 NA
3 NA NA
1 1  NA


最后的输出是名称和平均值

Joe Bob Sam
1.5 1.5 NA


好吧,我尝试了罗杰的建议,现在我遇到了这个错误:

追溯(最近一次通话):
  文件“ C:/avy14.py”,第5行,在
    对于f中的行:
ValueError:对关闭的文件进行I / O操作

这是新代码:

使用open('C://achip.txt',“ rtU”)为f:
  列= f.readline()。strip()。split(“”)
  总和= [0] * len(列)
行= 0
对于f中的行:
  行= line.strip()
  如果不行:
    继续

行+ = 1
  对于col,v在enumerate(line.split())中:
    如果sums [col]不为None:
      如果v ==“ NA”:
        sums [col] =无
      其他:
        sums [col] + = int(v)

使用open(“ c:/chipdone.txt”,“ w”)如下所示:
    对于名称,以zip表示的总和(列,总和):
        打印>>出,名称,
    如果sum为None:
      打印>> out,“ NA”
    其他:
      打印>> out,总和/行

最佳答案

with open("c:/achip.txt", "rU") as f:
  columns = f.readline().strip().split()
  sums = [0.0] * len(columns)
  row_counts = [0] * len(columns)

  for line in f:
    line = line.strip()
    if not line:
      continue

    for col, v in enumerate(line.split()):
      if v != "NA":
        sums[col] += int(v)
        row_counts[col] += 1

with open("c:/chipdone.txt", "w") as out:
  for name, sum, rows in zip(columns, sums, row_counts):
    print >>out, name,
    if rows == 0:
      print >>out, "NA"
    else:
      print >>out, sum / rows


获取列名称时,我也会使用split的无参数版本(它允许您使用多个空格分隔符)。

关于您的编辑以包括输入/​​输出样本,我保留了原始格式,输出为:

乔1.75
鲍勃2.33333333333
山姆


这种格式是(ColumnName,Avg)列的3行,但是您可以根据需要更改输出。 :)

关于python - 帮助Python中的if else循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3788229/

10-16 03:17