在date列上分割大数据集的最快方法

时间:2018-12-08 03:08:45

标签: python pandas csv date

我有一个1400万行的CSV文件,其中有一个日期列(而不是第一列),我希望以此作为过滤和拆分数据的依据。

目前,我正在将其加载到pandas数据框中:

df = pd.read_csv(filepath, dtype=str) 

for date in df['dates'].unique():
    subset = df[df['dates'] == date]
    subset.to_csv(date + dest_path)

有更快的方法吗?

Filter out rows from CSV before loading to pandas dataframe提供了一个有趣的解决方案,但不幸的是,我要细分的列不在第一列中。

编辑:

我纯粹需要将csv文件拆分为每个日期。生成的csv文件将传递给另一个团队。我需要所有列,我不想更改任何数据,我不需要执行任何groupby。

1 个答案:

答案 0 :(得分:0)

主要问题是将整个数据集读取到内存中。通常,对于非常大的文件,我需要逐行读取文件,因为它不适合内存。因此,我拆分了文件,然后才可以使用部件(使用Python / pandas,R或Stata,它们都将整个数据集加载到内存中)。

要分割文件,我将从头开始编写CSV阅读器。如果您不必处理带引号的字符串中的分隔符,则不会太困难(否则使用regex并不会困难得多)。内置的csv模块可以用更少的代码来实现(我承认我从未使用过它)。

以下内容根据变量的值分割文件。还可以使代码适应以固定的行数分割,过滤,添加或删除变量...

import sys

def main(arg):
    if len(arg) != 3:
        print("csvsplit infile outfile variable")
        return

    input_name = arg[0]
    output_name = arg[1]
    split_var = arg[2]

    sep = ","
    outfiles = {}

    with open(input_name) as f:
        var = f.readline().rstrip("\r\n").split(sep)
        ivar = {name: i for i, name in enumerate(var)}
        ikey = ivar[split_var]

        for line in f:
            v = line.rstrip("\r\n").split(sep)
            key = v[ikey]
            if key not in outfiles:
                outfiles[key] = open("%s_%s.csv" % (output_name, key), "wt")
                outfiles[key].write(sep.join(var) + "\n")
            outfiles[key].write(line)

    for key, outfile in outfiles.items():
        outfile.close()

main(sys.argv[1:])