[英]How to get the difference between two adjacent columns in csv file using python?
我是python的初学者。 我正在尝试使用python 2.7获取csv文件中两个相邻列之间的差异。
输入样例:
Temperature 20 21 23 27 ...
Smoke Obscuration 0.1 0.3 0.6 0.7 ...
Carbon Dioxide 0.05 0.07 0.08 0.09 ...
......
......
我想计算两个相邻值之间的差,并得到如下输出:
Temperature 0 1 2 4 ...
Smoke Obscuration 0 0.2 0.3 0.1 ...
Carbon Dioxide 0 0.02 0.01 0.01 ...
......
......
据我所知:
import csv
with open("test1.csv", "rb") as f_in, open("test2.csv", "w") as f_out:
r = csv.reader(f_in)
w = csv.writer(f_out)
for row in r:
for i, v in enumerate(row):
if i > 1:
v = (float(row[i]) - float(row[i-1]))
w.writerow(row)
它给出了一个错误:
ValueError:无法将字符串转换为float:
有人可以帮忙吗? 任何指导将不胜感激。
您的源文件可能存在一些间距问题,因此可能很难重现您的特定错误。 由于没有原始文件,因此将您的数据从此处复制到文本文件中,然后在Excel中将其重新保存为csv
。 除了输出错误外,我没有遇到其他错误。 这表明只要逻辑正确,就可以很好地读取和写入数据。
选项1:使用csv
模块
我主要通过使每一行都可迭代(即list
)来纠正一些逻辑,而writerow
方法需要:
import csv
# with open("test1.csv", "r") as f_in, open("test2.csv", "w", newline="") as f_out: # python 3
with open("test1.csv", "r") as f_in, open("test2.csv", "wb") as f_out: # python 2
r = csv.reader(f_in)
w = csv.writer(f_out)
values = []
for row in r:
for i, v in enumerate(row):
if i == 0:
values.append(v)
if i == 1:
values.append(0)
if i > 1:
values.append(float(row[i]) - float(row[i-1]))
w.writerow(values)
values = []
选项2:使用pandas
库
您可以pip install pandas
或(如果使用Anaconda,则可以conda install pandas
),并且可以更简单地执行此操作:
import pandas as pd
df = pd.read_csv("test1.csv", header=None, index_col=0)
df2 = df.diff(axis=1)
df2.to_csv("test2.csv", header=False, na_rep=0)
为两个选项输出csv
(在Excel中)
在文本编辑器中打开时,默认情况下这些输出以逗号分隔。 如果需要,可以使用单独的选项选择不同的间距(请参见参考资料)。
试试这些选项。 如果有错误,请确认您的源文件是干净的,以便正确读取它们。 现在,使用print
语句来验证所需的输出。
参考文献:
您的输入文件不是容易解析的csv文件。 它使用空格来分隔列,但也使用列零内的空格。 我认为csv模块不会为您提供帮助,但您可以自己使用一些正则表达式来解析该行。 我的示例通过假设列0名称不包含数字来工作。 如果那通常是不正确的,它将被打破。
import re
_col_0_re = re.compile(r'[^\d]+')
_col_x_re = re.compile(r'[\d\.]+')
def get_row(line):
row = []
line = line.strip()
match = _col_0_re.match(line)
if match:
# pull out column 0 string
row.append(line[:match.end()].strip())
# find the remaining floats on the line
row.extend(float(col) for col in _col_x_re.findall(line[match.end():]))
return row
with open("test1.csv", "r") as f_in, open("test2.csv", "w") as f_out:
for line in f_in:
row = get_row(line)
print(row)
if row:
diffs = (row[i] - row[i-1] for i in range(2, len(row)))
diff_str = ''.join('{:10.2f}'.format(diff) for diff in diffs)
f_out.write('{0:20} 0 {1}\n'.format(row[0], diff_str))
您的样本数据的输出是
Temperature 0 1.00 2.00 4.00
Smoke Obscuration 0 0.20 0.30 0.10
Carbon Dioxide 0 0.02 0.01 0.01
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.