比较csv文件中的数据列以及查找/编辑坏数据点

时间:2017-01-27 14:53:36

标签: python python-3.x

我正在编写代码来执行一些数据分析。我想比较数据列中的数字。

我想使用的约束是具有“POA”的列是否>然后,列A401 A402和A403必须> 900。 7.如果不满足这个条件,我想对数据做一些事情,以便很容易找到。也不希望在测试条件中包含VT列。

如果有人能指出我正确的方向,我真的很感激。

我输入的数据样本为.CSV

DateTime       A0401    A0402   A0403   VT      POA
11/1/2014 0:00  1.12    0.96    1.11    4.06    50.00
11/1/2014 0:01  1.12    0.95    1.11    4.06    50.00
11/1/2014 0:02  1.12    0.95    1.11    4.06    100.00
11/1/2014 0:03  1.12    0.95    1.11    4.06    300.00
11/1/2014 0:04  1.12    0.96    1.11    4.06    901.00
11/1/2014 0:05  1.12    0.95    1.11    4.06    40.00
11/1/2014 0:06  1.12    0.95    1.11    4.06    0.00
11/1/2014 0:07  1.12    0.96    1.11    4.06    904.00
11/1/2014 0:09  1.12    0.96    1.11    4.06    100.00
11/1/2014 0:10  1.12    0.96    1.11    3.93    150.00

2 个答案:

答案 0 :(得分:1)

我们假设您有一个文件data.csv,内容为:

DateTime       A0401    A0402   A0403   VT      POA
11/1/2014 0:00  1.12    0.96    1.11    4.06    50.00
11/1/2014 0:01  1.12    0.95    1.11    4.06    50.00
11/1/2014 0:02  1.12    0.95    1.11    4.06    100.00
11/1/2014 0:03  1.12    0.95    1.11    4.06    300.00
11/1/2014 0:04  1.12    0.96    1.11    4.06    901.00
11/1/2014 0:05  1.12    0.95    1.11    4.06    40.00
11/1/2014 0:06  1.12    0.95    1.11    4.06    0.00
11/1/2014 0:07  1.12    0.96    1.11    4.06    904.00
11/1/2014 0:09  1.12    0.96    1.11    4.06    100.00
11/1/2014 0:10  1.12    0.96    1.11    3.93    150.00

然后您可以使用Python处理它:

# Open the file 
with open('data.csv', 'r') as f:
    # Split each line into row "cells"
    rows = [row.split('\t') for row in f]
    # Keep only non-empty strings (not "falsy") and remove extra spaces (strip)
    rows = [[cell.strip() for cell in row if cell] for row in rows]

def isValidRow(row):
    return float(row[5]) <= 900 or all(float(val) > 7 for val in row[1:4])

header, rows = rows[0], rows[1:]
validRows = list(map(isValidRow, rows))

# Write output
with open('output.csv', 'w') as f:
    f.write('\t'.join(header + ['IsValid']) + '\n')
    for row, valid in zip(rows, validRows):
        f.write('\t'.join(row + [str(valid)]) + '\n')

然后output.txt将包含:

DateTime    A0401   A0402   A0403   VT  POA IsValid
11/1/2014 0:00  1.12    0.96    1.11    4.06    50.00   True
11/1/2014 0:01  1.12    0.95    1.11    4.06    50.00   True
11/1/2014 0:02  1.12    0.95    1.11    4.06    100.00  True
11/1/2014 0:03  1.12    0.95    1.11    4.06    300.00  True
11/1/2014 0:04  1.12    0.96    1.11    4.06    901.00  False
11/1/2014 0:05  1.12    0.95    1.11    4.06    40.00   True
11/1/2014 0:06  1.12    0.95    1.11    4.06    0.00    True
11/1/2014 0:07  1.12    0.96    1.11    4.06    904.00  False
11/1/2014 0:09  1.12    0.96    1.11    4.06    100.00  True
11/1/2014 0:10  1.12    0.96    1.11    3.93    150.00  True

答案 1 :(得分:0)

使用https://docs.python.org/2/library/csv.html将CSV数据读入可迭代对象。

我猜你的意思是,如果POA> 900且A0401,A0402和A0403> 7,否则你想对数据做些什么?

for row in reader:
    if not (row[5] > 900 and row[1] > 7 and row[2] > 7 and row[3] > 7):
        #do something

您的问题的另一个含义可能是,如果POA> 900,那么您想将A0401,A0402和A0403设置为大于7,否则,您想要做其他事情。

在哪种情况下

for row in reader:
    if row[5] > 900:
        row[1] = 7.1
        row[2] = 7.1
        row[3] = 7.1
    else:
        #do something

对于你做的事情,我不完全确定你想要的数据很容易找到你的意思,但我会假设你想以某种方式突出它。如果您希望轻松找到它,可以在CSV数据中添加另一列。像'flagged'这样的东西,默认设置为0。

当您发现异常时,只需将标记设置为1,然后您可以查看数据并找到标记为1的所有行以查找异常。