Python分析和更改数据值

时间:2018-11-17 20:20:20

标签: python csv

我试图使程序正常运行,但是由于我没有太多经验,所以遇到了很多问题。我的工作思路是分析csv文件的数据并将负值更改为0。 到目前为止,我已经设法从文件中获取所有数据并将其保存到列表中,并手动分配了文件的“开始”和“结束”时间。

import csv

data = []

filename = str(input("Give the file name: "))
    with open(filename) as csvfile:
        spamreader = csv.reader(csvfile, delimiter=';')
        for row in spamreader:
            data.append(row)

    print("File", filename, "is opened,", len(data),"rows will be analyzed.")

    data.pop(0) #deletes the header   

    print (f'Analyzing data between dates {data[0][0]} and {data[1097][0]}.') #data[row][column]

如何将数据(屏幕快照)中的负值更改为0,然后将所有内容保存到新的csv文件中?帮助将不胜感激。 screenshot inside the CSV file asd

[在实际数据文件中,有1000多行]

2 个答案:

答案 0 :(得分:1)

如果文件中仅包含数字,则可以尝试以下代码:

import csv
from collections import defaultdict

def convert(item):
    try:
        item = float(item)
        if item < 0:
            return 0
        else:
            return item
    except ValueError:
        return item

sums = defaultdict(list)

with open('Data.csv', 'r') as inp, open('output.csv', 'w', newline = '') as outp:
    reader = csv.reader(inp, delimiter = ';')
    writer = csv.writer(outp, delimiter = ';', dialect = 'excel')
    headers = next(reader)
    for line in reader:
        line = [convert(i) for i in line]
        sums[line[0]].append(line[1])
        writer.writerow(line)

for k,v in sums.items():
    print('key: {} total: {}'.format(k,sum(v)))

首先,您可以使用with上下文管理器打开您要从中读取和写入的两个文件。然后,无需将其存储到列表中,而是可以转换数据并将其直接写入目标文件(此处为output.csv)。 for line in reader在这里循环遍历,并将每个值转换为绝对整数,然后再将其写入文件。

如果要将值存储到字典中以使用它们,我从Python标准库中添加了defaultdict。字典sums将包含按日期排列的键及其值。要按天打印总和,您可以简单地使用字符串格式来打印键和总和值。

答案 1 :(得分:0)

使用pandas DataFrame可以轻松实现:

import pandas as pd

c = pd.read_csv('inputcsvfile.csv')
processed_csv = c[c > 0].fillna(value=0)
processed_csv.to_csv('outputcsvfile.csv')

Pandas是一个外部库,因此您需要先安装(pip install pandas),然后才能使用此解决方案