按列拆分CSV

时间:2018-04-25 07:40:49

标签: python csv

我正在尝试拆分包含1500多家公司库存数据的CSV文件。第一列包含日期,后续列包含公司数据。

目标1:我试图将巨大的CSV文件分成更小的部分。让我们说每个较小的文件有30家公司。为此,我需要按列号拆分CSV,而不是行。我一直在寻找代码片段,但我还没有找到任何完全符合这一要求的内容。此外,每个单独的文件都需要包含第一列,即日期。

目标2:我想让公司名称成为自己的列,日期是自己的列和自己的指标列。因此,我可以将公司的数据称为Django中的单个记录(行) - 我不需要所有日期,只需每个季度的最后一天。现在,我必须按日期和指示器过滤数据,并将其设置为在我的前端显示的对象。

enter image description here

如果您有疑问,请询问。

修改

以下是我修补的一些代码。

import os
import csv
from math import floor
from datetime import datetime
import re

class SimFinDataset:
    def __init__(self, dataFilePath, csvDelimiter = "semicolon"):

        self.numIndicators = None
        self.numCompanies = 1

        # load data
        self.loadData(dataFilePath, csvDelimiter)

    def loadData(self, filePath, delimiter):

        numRow = 0

        delimiterChar = ";" if delimiter == "semicolon" else ","

        csvfile = open(filePath, 'rb')
        reader = csv.reader(csvfile, delimiter=delimiterChar, quotechar='"')
        header = next(reader)
        row_count = sum(1 for _ in reader)
        csvfile.seek(0)

        for row in reader:
            numRow += 1
            if numRow > 1 and numRow != row_count and numRow != row_count-1:
                # company id row
                if numRow == 2:
                    rowLen = len(row)
                    idVal = None
                    for index, columnVal in enumerate(row):
                        if index > 0:
                            if idVal is not None and idVal != columnVal:
                                self.numCompanies += 1
                                if self.numIndicators is None:
                                    self.numIndicators = index - 1
                            if index + 1 == rowLen:
                                if self.numIndicators is None:
                                    self.numIndicators = index
                            idVal = columnVal
                if numRow > 2 and self.numIndicators is None:
                    return
                else:
                    filename = 1
                    with open(str(filename) + '.csv', 'wb') as csvfile:
                        if self.numCompanies % 30 == 0:
                            print ("im working")
                            spamwriter = csv.writer(csvfile, delimiter=';')
                            spamwriter.writerow(header)
                            spamwriter.writerow(row)
                            filename += 1

                #print (self.numIndicators)

dataset = SimFinDataset('new-data.csv','semicolon')

1 个答案:

答案 0 :(得分:0)

目标1的解决方案就在这里。 splitting CSV file by columns

但是你有熊猫的方式:

import pandas as pd

# let's say first 10 columns

csv_path="mycsv.csv"
out_path ="\\...\\out.csv"
pd.read_csv(csv_path).iloc[:, :10].to_csv(out_path)

您也可以执行类似

的操作
mydf.groupby("company_name").unstack()`

使每个公司成为自己的专栏