繁体   English   中英

如何使用python获取csv文件中两个相邻列之间的差异?

[英]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语句来验证所需的输出。

参考文献:

  1. 用Python编写的CSV文件每行之间都有空行
  2. 如何在python列表中的列和行中将数据写入csv文件?
  3. 如何在python中使用csv分隔符
  4. 分隔符-将熊猫写入CSV文件

您的输入文件不是容易解析的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM