我正在编写代码来执行一些数据分析。我想比较数据列中的数字。
我想使用的约束是具有“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
答案 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的所有行以查找异常。