确定数据类型并对int和float列执行数学运算

时间:2015-03-18 06:38:41

标签: python csv

我有一个大的csv文件而不是浮点数,整数和字符串,只使用我需要确定数据类型的csv模块,然后在包含数字的列上执行模式,平均值等计算。到目前为止我有这个:

import csv

file = open('adult.csv')
reader = csv.reader(file)
filename = 'output.xml'
text = open(filename, 'w')
text.write('<?xml version="1.0"?>')
text.write('<!DOCTYPE summary [')


def getType2(value):
    try:
        float(value)
        if "." in value:
            print 'float',
            return 'float'

        else:
            print 'int',
            return 'int'

    except ValueError:
        print 'str',


headers = reader.next()
length= len(headers)
print length
i=0
while i<length:

    print '<name>',
    print headers[i],
    print '</name>'
    print '<type>',
    value = reader.next()
    if getType2(value[i]) == 'int':
        data =[]
        total =0
        for row in reader:
            data.append(float(row[i]))
            total += int(row[i])
            print total


    print '</type>\n\n'
    print
    i= i+1

print '<!ELEMENT summary\n\n>'

这正确地确定了数据类型,并且会正确地执行第一列,但是我得到索引错误,它不会移动到下一列。

非常确定我这样做是一种非常复杂的方式,因为必须有一种更简单的方法来处理这个问题。

1 个答案:

答案 0 :(得分:0)

它仅适用于第一列的原因是因为您迭代csv reader对象的方式:

你有一个while循环,你打算迭代列,但在该循环内,就在if - 子句之前,你也是每次调用reader.next(),将返回文件中的下一个。这意味着如果它不是if - 子句中发生的操作,那么您只会检查此csv文件对角线上的元素。在if - 子句中,您将迭代文件中的所有行,读取器对象是迭代器,这意味着一旦您获得了一个元素(例如,线路),没有办法再次获得它(你不能跳回到第1行,例如,如果你已经看过第2行)。

您当前的做法确实有点令人费解。如果要处理整个文件并对所有列进行操作,则必须将整个文件加载到内存中并为其生成有效的数据结构。

如果您正在处理的数据文件是一个表现良好的csv文件,那么最好使用numpy.genfromtxt,这将返回一个具有mean等方法的numpy对象。它用于数值计算。您还可以查看提供类似功能的pandas。使用这些库会阻止您重新发明轮子。

将数据集加载到pandas数据框或numpy数组中后,您可以轻松完成剩余的数值处理,并继续将所需的值写入输出文件。有关如何在链接底部使用np.genfromtxt的示例,这应该有助于您入门。